Data not being received from DHT22 Temperature/Humidity Sensor

137 views
Skip to first unread message

Michael Grossie

unread,
Sep 1, 2020, 6:31:37 PM9/1/20
to weewx-user
Pardon - this topic was started in thread called - Unable to start weewx - with ADS-WS1 Station
Raspberry Pi 2B+
Installed with setup.py
WS1 Weather Station
Weewx 4.1.1
Extra Sensor - Adafruit DHT22 - Temperature and humidity sensor.
Service - Extra_sensors_service - located in /home/weewx/bin/user
(frame work for the above file from a script that used a BMP085/180)

I am trying to gather the data from the Adafruit DHT22 and insert it into the "outTemp" and the "outHumidity" columns of the archive.sdb.  The "driver" or "service" is based on one that I found on Github for the BMP085/180.
I can see that data is being received in a csv file that I wrote a script for (with the help of script I found on Raspberrypi.org). 
I can see in the Loop Data that both outTemp and outHumidity are listed but they have no data associated with them.
I thought about just parsing the data from the csv with fileparse, but since I can't seem to get this service script to work, I don't have much confidence that I can make it work with file parse.
Below are the weewx.conf files and the extra_sensors_service script.  

==================
# WEEWX CONFIGURATION FILE
#
# Copyright (c) 2009-2019 Tom Keffer <tkeffer>
# See the file LICENSE.txt for your rights.

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

# This section is for general configuration information.

# Set to 1 for extra debug info, otherwise comment it out or set to zero
debug = 1

# Root directory of the weewx data file hierarchy for this station
WEEWX_ROOT = /home/weewx

# Whether to log successful operations
log_success = True

# Whether to log unsuccessful operations
log_failure = True

# How long to wait before timing out a socket (FTP, HTTP) connection
socket_timeout = 20

# Do not modify this. It is used when installing and updating weewx.
version = 4.1.1

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

#   This section is for information about the station.

[Station]
    
    # Description of the station location
    location = "Casita - Yuma, AZ"
    
    # Latitude in decimal degrees. Negative for southern hemisphere
    latitude = 31.6288
    # Longitude in decimal degrees. Negative for western hemisphere.
    longitude = -114.4056
    
    # Altitude of the station, with unit it is in. This is downloaded from
    # from the station if the hardware supports it.
    altitude = 424, foot    # Choose 'foot' or 'meter' for unit
    
    # Set to type of station hardware. There must be a corresponding stanza
    # in this file with a 'driver' parameter indicating the driver to be used.
    station_type = WS1
    
    # If you have a website, you may specify an URL
    station_url = http://www.grossie.???
    
    # The start of the rain year (1=January; 10=October, etc.). This is
    # downloaded from the station if the hardware supports it.
    rain_year_start = 1
    
    # Start of week (0=Monday, 6=Sunday)
    week_start = 6

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

[WS1]
    # This section is for the ADS WS1 series of weather stations.
    
    # Driver mode - tcp, udp, or serial
    mode = serial
    
    # If serial, specify the serial port device. (ex. /dev/ttyS0, /dev/ttyUSB0,
    # or /dev/cuaU0)
    # If TCP, specify the IP address and port number. (ex. 192.168.36.25:3000)
    port = /dev/ttyUSB0
    
    # The amount of time, in seconds, before the connection fails if there is
    # no response
    timeout = 10
    
    # The driver to use:
    driver = weewx.drivers.ws1

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

[Simulator]
    # This section is for the weewx weather station simulator
    
    # The time (in seconds) between LOOP packets.
    loop_interval = 2.5
    
    # The simulator mode can be either 'simulator' or 'generator'.
    # Real-time simulator. Sleep between each LOOP packet.
    mode = simulator
    # Generator.  Emit LOOP packets as fast as possible (useful for testing).
    #mode = generator
    
    # The start time. Format is YYYY-mm-ddTHH:MM. If not specified, the default 
    # is to use the present time.
    #start = 2011-01-01T00:00
    
    # The driver to use:
    driver = weewx.drivers.simulator

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

#   This section is for uploading data to Internet sites

[StdRESTful]
    
    [[StationRegistry]]
        # To register this weather station with weewx, set this to true
        register_this_station = true
    
    [[AWEKAS]]
        # This section is for configuring posts to AWEKAS.
        
        # If you wish to do this, set the option 'enable' to true,
        # and specify a username and password.
        # To guard against parsing errors, put the password in quotes.
        enable = false
        username = replace_me
        password = replace_me
    
    [[CWOP]]
        # This section is for configuring posts to CWOP.
        
        # If you wish to do this, set the option 'enable' to true,
        # and specify the station ID (e.g., CW1234).
        enable = false
        station = replace_me
    
    # If this is an APRS (radio amateur) station, uncomment
    # the following and replace with a passcode (e.g., 12345).
    #passcode = replace_me (APRS stations only)
    
    [[PWSweather]]
        # This section is for configuring posts to PWSweather.com.
        
        # If you wish to do this, set the option 'enable' to true,
        # and specify a station and password.
        # To guard against parsing errors, put the password in quotes.
        enable = false
        station = replace_me
        password = replace_me
    
    [[WOW]]
        # This section is for configuring posts to WOW.
        
        # If you wish to do this, set the option 'enable' to true,
        # and specify a station and password.
        # To guard against parsing errors, put the password in quotes.
        enable = false
        station = replace_me
        password = replace_me
    
    [[Wunderground]]
        # This section is for configuring posts to the Weather Underground.
        
        # If you wish to do this, set the option 'enable' to true,
        # and specify a station (e.g., 'KORHOODR3') and password.
        # To guard against parsing errors, put the password in quotes.
        enable = false
        station = replace_me
        password = replace_me
        
        # If you plan on using wunderfixer, set the following
        # to your API key:
        api_key = replace_me
        
        # Set the following to True to have weewx use the WU "Rapidfire"
        # protocol. Not all hardware can support it. See the User's Guide.
        rapidfire = False

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

#   This section specifies what reports, using which skins, to generate.

[StdReport]
    
    # Where the skins reside, relative to WEEWX_ROOT
    SKIN_ROOT = skins
    
    # Where the generated reports should go, relative to WEEWX_ROOT
    HTML_ROOT = public_html
    
    # The database binding indicates which data should be used in reports.
    data_binding = wx_binding
    
    # Whether to log a successful operation
    log_success = True
    
    # Whether to log an unsuccessful operation
    log_failure = False
    
    # Each of the following subsections defines a report that will be run.
    # See the customizing guide to change the units, plot types and line
    # colors, modify the fonts, display additional sensor data, and other
    # customizations. Many of those changes can be made here by overriding
    # parameters, or by modifying templates within the skin itself.
    
    [[SeasonsReport]]
        # The SeasonsReport uses the 'Seasons' skin, which contains the
        # images, templates and plots for the report.
        skin = Seasons
        enable = true
    
    [[SmartphoneReport]]
        # The SmartphoneReport uses the 'Smartphone' skin, and the images and
        # files are placed in a dedicated subdirectory.
        skin = Smartphone
        enable = true
        HTML_ROOT = public_html/smartphone
    
    [[MobileReport]]
        # The MobileReport uses the 'Mobile' skin, and the images and files
        # are placed in a dedicated subdirectory.
        skin = Mobile
        enable = true
        HTML_ROOT = public_html/mobile
    
    [[StandardReport]]
        # This is the old "Standard" skin. By default, it is not enabled.
        skin = Standard
        enable = false
    
    [[FTP]]
        # FTP'ing the results to a webserver is treated as just another report,
        # albeit one with an unusual report generator!
        skin = Ftp
        
        # If you wish to use FTP, set "enable" to "true", then
        # fill out the next four lines.
        # Use quotes around passwords to guard against parsing errors.
        enable = false
        user = replace_me
        password = replace_me
        server = replace_me    # The ftp server name, e.g, www.myserver.org
        path = replace_me    # The destination directory, e.g., /weather
        
        # Set to True for an FTP over TLS (FTPS) connection. Not all servers
        # support this.
        secure_ftp = False
        
        # To upload files from something other than what HTML_ROOT is set
        # to above, specify a different HTML_ROOT here.
        #HTML_ROOT = public_html
        
        # Most FTP servers use port 21
        port = 21
        
        # Set to 1 to use passive mode, zero for active mode
        passive = 1
    
    [[RSYNC]]
        # rsync'ing to a webserver is treated as just another report
        skin = Rsync
        
        # If you wish to use rsync, you must configure passwordless ssh using
        # public/private key authentication from the user account that weewx
        # runs to the user account on the remote machine where the files
        # will be copied.
        #
        # If you wish to use rsync, set "enable" to "true", then
        # fill out server, user, and path.
        # The server should appear in your .ssh/config file.
        # The user is the username used in the identity file.
        # The path is the destination directory, such as /var/www/html/weather.
        # Be sure that the user has write permissions on the destination!
        enable = false
        server = replace_me
        user = replace_me
        path = replace_me
        
        # To upload files from something other than what HTML_ROOT is set
        # to above, specify a different HTML_ROOT here.
        #HTML_ROOT = public_html
        
        # Rsync can be configured to remove files from the remote server if
        # they don't exist under HTML_ROOT locally. USE WITH CAUTION: if you
        # make a mistake in the remote path, you could could unintentionally
        # cause unrelated files to be deleted. Set to 1 to enable remote file
        # deletion, zero to allow files to accumulate remotely.
        delete = 0
    
    ####
    
    # Various options for customizing your reports.
    
    [[Defaults]]
        
        [[[Units]]]
            
            # The following section sets what unit to use for each unit group.
            # NB: The unit is always in the singular. I.e., 'mile_per_hour',
            # NOT 'miles_per_hour'
            [[[[Groups]]]]
                
                group_altitude = foot    # Options are 'foot' or 'meter'
                group_degree_day = degree_F_day    # Options are 'degree_F_day' or 'degree_C_day'
                group_distance = mile    # Options are 'mile' or 'km'
                group_pressure = inHg    # Options are 'inHg', 'mmHg', 'mbar', or 'hPa'
                group_rain = inch    # Options are 'inch', 'cm', or 'mm'
                group_rainrate = inch_per_hour    # Options are 'inch_per_hour', 'cm_per_hour', or 'mm_per_hour'
                group_speed = mile_per_hour    # Options are 'mile_per_hour', 'km_per_hour', 'knot', or 'meter_per_second'
                group_speed2 = mile_per_hour2    # Options are 'mile_per_hour2', 'km_per_hour2', 'knot2', or 'meter_per_second2'
                group_temperature = degree_F    # Options are 'degree_F' or 'degree_C'
            
            # The following section sets the formatting for each type of unit.
            [[[[StringFormats]]]]
                
                centibar = %.0f
                cm = %.2f
                cm_per_hour = %.2f
                degree_C = %.1f
                degree_F = %.1f
                degree_compass = %.0f
                foot = %.0f
                hPa = %.1f
                hour = %.1f
                inHg = %.3f
                inch = %.2f
                inch_per_hour = %.2f
                km = %.1f
                km_per_hour = %.0f
                km_per_hour2 = %.1f
                knot = %.0f
                knot2 = %.1f
                mbar = %.1f
                meter = %.0f
                meter_per_second = %.1f
                meter_per_second2 = %.1f
                mile = %.1f
                mile_per_hour = %.0f
                mile_per_hour2 = %.1f
                mm = %.1f
                mmHg = %.1f
                mm_per_hour = %.1f
                percent = %.0f
                second = %.0f
                uv_index = %.1f
                volt = %.1f
                watt_per_meter_squared = %.0f
                NONE = "   N/A"
            
            # The following section overrides the label used for each type of unit
            [[[[Labels]]]]
                
                meter = " meter", " meters"    # You may prefer "metre".
                day = " day", " days"
                hour = " hour", " hours"
                minute = " minute", " minutes"
                second = " second", " seconds"
                NONE = ""
            
            # The following section sets the format for each time scale.
            # The values below will work in every locale, but they may not look
            # particularly attractive.
            [[[[TimeFormats]]]]
                
                hour = %H:%M
                day = %X
                week = %X (%A)
                month = %x %X
                year = %x %X
                rainyear = %x %X
                current = %x %X
                ephem_day = %X
                ephem_year = %x %X
            
            [[[[Ordinates]]]]
                
                # Ordinal directions. The last one is for no wind direction
                directions = N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW, N/A
            
            # The following section sets the base temperatures used for the
            #  calculation of heating, cooling, and growing degree-days.
            [[[[DegreeDays]]]]
                
                # Base temperature for heating days, with unit:
                heating_base = 65, degree_F
                # Base temperature for cooling days, with unit:
                cooling_base = 65, degree_F
                # Base temperature for growing days, with unit:
                growing_base = 50, degree_F
            
            # A trend takes a difference across a time period. The following
            # section sets the time period, and how big an error is allowed to
            # still be counted as the start or end of a period.
            [[[[Trend]]]]
                
                time_delta = 10800    # 3 hours
                time_grace = 300    # 5 minutes
        
        # The labels to be used for each observation type
        [[[Labels]]]
            
            # Set to hemisphere abbreviations suitable for your location:
            hemispheres = N, S, E, W
            
            # Formats to be used for latitude whole degrees, longitude whole
            # degrees, and minutes:
            latlon_formats = %02d, %03d, %05.2f
            
            # Generic labels, keyed by an observation type.
            [[[[Generic]]]]
                barometer = Barometer
                dewpoint = Dew Point
                ET = ET
                heatindex = Heat Index
                inHumidity = Inside Humidity
                inTemp = Inside Temperature
                outHumidity = Humidity
                outTemp = Outside Temperature
                radiation = Radiation
                rain = Rain
                rainRate = Rain Rate
                UV = UV Index
                windDir = Wind Direction
                windGust = Gust Speed
                windGustDir = Gust Direction
                windSpeed = Wind Speed
                windchill = Wind Chill
                windgustvec = Gust Vector
                windvec = Wind Vector
                extraTemp1 = Temperature1
                extraTemp2 = Temperature2
                extraTemp3 = Temperature3
                
                # Sensor status indicators
                
                rxCheckPercent = Signal Quality
                txBatteryStatus = Transmitter Battery
                windBatteryStatus = Wind Battery
                rainBatteryStatus = Rain Battery
                outTempBatteryStatus = Outside Temperature Battery
                inTempBatteryStatus = Inside Temperature Battery
                consBatteryVoltage = Console Battery
                heatingVoltage = Heating Battery
                supplyVoltage = Supply Voltage
                referenceVoltage = Reference Voltage
        
        [[[Almanac]]]
            
            # The labels to be used for the phases of the moon:
            moon_phases = New, Waxing crescent, First quarter, Waxing gibbous, Full, Waning gibbous, Last quarter, Waning crescent

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

#   This service acts as a filter, converting the unit system coming from
#   the hardware to a unit system in the database.

[StdConvert]
    
    # The target_unit affects only the unit system in the database. Once
    # chosen it cannot be changed without converting the entire database.
    # Modification of target_unit after starting weewx will result in
    # corrupt data - the database will contain a mix of US and METRIC data.
    #
    # The value of target_unit does not affect the unit system for
    # reporting - reports can display US, Metric, or any combination of units.
    #
    # In most cases, target_unit should be left as the default: US
    #
    # In particular, those migrating from a standard wview installation
    # should use US since that is what the wview database contains.
    
    # DO NOT MODIFY THIS VALUE UNLESS YOU KNOW WHAT YOU ARE DOING!
    target_unit = US    # Options are 'US', 'METRICWX', or 'METRIC'

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

#   This section can adjust data using calibration expressions.

[StdCalibrate]
    
    [[Corrections]]
        # For each type, an arbitrary calibration expression can be given.
        # It should be in the units defined in the StdConvert section.
        # Example:
        foo = foo + 0.2

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

#   This section is for quality control checks. If units are not specified,
#   values must be in the units defined in the StdConvert section.

[StdQC]
    
    [[MinMax]]
        barometer = 26, 32.5, inHg
        pressure = 24, 34.5, inHg
        outTemp = -40, 120, degree_F
        inTemp = 10, 120, degree_F
        outHumidity = 0, 100
        inHumidity = 0, 100
        windSpeed = 0, 120, mile_per_hour
        rain = 0, 10, inch

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

#   This section controls the origin of derived values.

[StdWXCalculate]
    
    [[Calculations]]
        # How to calculate derived quantities.  Possible values are:
        #  hardware        - use the value provided by hardware
        #  software        - use the value calculated by weewx
        #  prefer_hardware - use value provide by hardware if available,
        #                      otherwise use value calculated by weewx
        
        pressure = prefer_hardware
        altimeter = prefer_hardware
        appTemp = prefer_hardware
        barometer = prefer_hardware
        beaufort = prefer_hardware
        cloudbase = prefer_hardware
        dewpoint = prefer_hardware
        ET = prefer_hardware
        heatindex = prefer_hardware
        humidex = prefer_hardware
        inDewpoint = prefer_hardware
        maxSolarRad = prefer_hardware
        rainRate = prefer_hardware
        windchill = prefer_hardware
        windrun = prefer_hardware

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

#   For hardware that supports it, this section controls how often the
#   onboard clock gets updated.

[StdTimeSynch]
    
    # How often to check the weather station clock for drift (in seconds)
    clock_check = 14400
    
    # How much it can drift before we will correct it (in seconds)
    max_drift = 5

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

#   This section is for configuring the archive service.

[StdArchive]
    
    # If the station hardware supports data logging then the archive interval
    # will be downloaded from the station. Otherwise, specify it (in seconds).
    archive_interval = 300
    
    # If possible, new archive records are downloaded from the station
    # hardware. If the hardware does not support this, then new archive
    # records will be generated in software.
    # Set the following to "software" to force software record generation.
    record_generation = hardware
    
    # Whether to include LOOP data in hi/low statistics
    loop_hilo = True
    
    # The data binding used to save archive records
    data_binding = wx_binding

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

#   This section binds a data store to a database.

[DataBindings]
    
    [[wx_binding]]
        # The database must match one of the sections in [Databases].
        # This is likely to be the only option you would want to change.
        database = archive_sqlite
        # The name of the table within the database
        table_name = archive
        # The manager handles aggregation of data for historical summaries
        manager = weewx.manager.DaySummaryManager
        # The schema defines the structure of the database.
        # It is *only* used when the database is created.
        schema = schemas.wview_extended.schema

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

#   This section defines various databases.

[Databases]
    
    # A SQLite database is simply a single file
    [[archive_sqlite]]
        database_name = weewx.sdb
        database_type = SQLite
    
    # MySQL
    [[archive_mysql]]
        database_name = weewx
        database_type = MySQL

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

#   This section defines defaults for the different types of databases.

[DatabaseTypes]
    
    # Defaults for SQLite databases
    [[SQLite]]
        driver = weedb.sqlite
        # Directory in which the database files are located
        SQLITE_ROOT = %(WEEWX_ROOT)s/archive
    
    # Defaults for MySQL databases
    [[MySQL]]
        driver = weedb.mysql
        # The host where the database is located
        host = localhost
        # The user name for logging in to the host
        user = weewx
        # The password for the user name (quotes guard against parsing errors)
        password = weewx

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

#   This section configures the internal weewx engine.

[Engine]
    
    [[Services]]
        # This section specifies the services that should be run. They are
        # grouped by type, and the order of services within each group
        # determines the order in which the services will be run.
        prep_services = weewx.engine.StdTimeSynch
        data_services = user.extra_sensors_service.ExtraSensorsService,
        process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate, weewx.engine.StdQC, weewx.wxservices.StdWXCalculate
        archive_services = weewx.engine.StdArchive
        restful_services = weewx.restx.StdStationRegistry, weewx.restx.StdWunderground, weewx.restx.StdPWSweather, weewx.restx.StdCWOP, weewx.restx.StdWOW, weewx.restx.StdAWEKAS
        report_services = weewx.engine.StdPrint, weewx.engine.StdReport

=============================== extra_sensors_service
import syslog
import weewx
import time
import os
from weewx.wxengine import StdService
#import Adafruit_BMP.BMP085 as BMP085
import Adafruit_DHT

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

class ExtraSensorsService(StdService):
    def __init__(self, engine, config_dict):
        super(ExtraSensorsService, self).__init__(engine, config_dict)      
        d = config_dict.get('ExtraSensorsService', {})
        # Read from config which pin to use on the RPI GPIO
        # Defaults to 4
        self.DHT22_pin = d.get('DHT22_pin', 4)
        # Use the loop packet event as that allows data to still get into the WeeWX database
        # as well as supporting a OLED module on the RPI
        self.bind(weewx.NEW_LOOP_PACKET, self.load_data)
    
    def load_data(self, event):
        try:
            #self.get_bmp180(event)
            self.get_DHT22(event)
        except Exception, e:
            syslog.syslog(syslog.LOG_ERR, "extrasensors: cannot read value: %s" % e) 

    # Get BMP180 data
    #def get_bmp180(self, event):
    #    sensor = BMP085.BMP085()

    #   pressure = float(sensor.read_pressure()/100.0)
    #    syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found pressure value of %s mbar" % pressure)
        # NOTE: stores as mbar
    #   event.packet['pressure'] = float(pressure)

    # Get DHT22 data
    def get_DHT22(self, event):
        sensor = Adafruit_DHT.DHT22()
        humidity, temperature = DHT.read_retry(DHT.DHT22, self.DHT22_pin)
        if humidity is not None:
            syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found humidity value of %s %%" % humidity)
            event.packet['outHumidity'] = float(humidity)
        if temperature is not None:
            syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found temperature value of %s C" % temperature)
            # NOTE: stores as celsius
            event.packet['outTemp'] = float(temperature)

=================================== Loop data
LOOP:   2020-09-01 17:25:14 CDT (1598999114) altimeter: 26.8909579546, appTemp: -7.515, barometer: 26.9313486, beaufort: 0, cloudbase: None, daily_rain: 0.15, dateTime: 1598999114, day_of_year: 0, dewpoint: None, heatindex: 0.0, humidex: None, inDewpoint: 14.5719060302, inHumidity: 5.0, inTemp: 96.5, maxSolarRad: None, minute_of_day: 0, outHumidity: 0.0, outTemp: 0.0, pressure: 26.4708164393, rain: 0.0, rainRate: 0, rain_total: 0.23, usUnits: 1, wind_average: 0.74564728398, windchill: 0.0, windDir: 268.23516, windSpeed: 0.559235462985
LOOP:   2020-09-01 17:25:15 CDT (1598999115) altimeter: 26.8909579546, appTemp: -7.62, barometer: 26.9313486, beaufort: 0, cloudbase: None, daily_rain: 0.15, dateTime: 1598999115, day_of_year: 0, dewpoint: None, heatindex: 0.0, humidex: None, inDewpoint: 14.5719060302, inHumidity: 5.0, inTemp: 96.5, maxSolarRad: None, minute_of_day: 0, outHumidity: 0.0, outTemp: 0.0, pressure: 26.4708164393, rain: 0.0, rainRate: 0, rain_total: 0.23, usUnits: 1, wind_average: 0.683510010315, windchill: 0.0, windDir: 269.646924, windSpeed: 0.74564728398
REC:    2020-09-01 17:25:00 CDT (1598999100) altimeter: 26.887839304, appTemp: -7.71530405405, barometer: 26.928216027, beaufort: 0.290540540541, cloudbase: None, daily_rain: 0.15, dateTime: 1598999100, day_of_year: 0.0, dewpoint: None, ET: None, heatindex: 0.0, humidex: None, inDewpoint: 14.5042904412, inHumidity: 5.0, inTemp: 96.4027027027, interval: 5, maxSolarRad: None, minute_of_day: 0.0, outHumidity: 0.0, outTemp: 0.0, pressure: 26.467737434, rain: 0.0, rainRate: 0.0, rain_total: 0.23, usUnits: 1, wind_average: 0.877688990518, windchill: 0.0, windDir: 297.618472457, windGust: 2.67190276759, windGustDir: 300.705732, windrun: 0.076237116732, windSpeed: 0.914845400784
LOOP:   2020-09-01 17:25:19 CDT (1598999119) altimeter: 26.8909579546, appTemp: -7.69, barometer: 26.9313486, beaufort: 0, cloudbase: None, daily_rain: 0.15, dateTime: 1598999119, day_of_year: 0, dewpoint: None, heatindex: 0.0, humidex: None, inDewpoint: 14.5719060302, inHumidity: 5.0, inTemp: 96.5, maxSolarRad: None, minute_of_day: 0, outHumidity: 0.0, outTemp: 0.0, pressure: 26.4708164393, rain: 0.0, rainRate: 0, rain_total: 0.23, usUnits: 1, wind_average: 0.74564728398, windchill: 0.0, windDir: 272.470452, windSpeed: 0.86992183131

============================= From DHT22 Sensor CSV file
09/01/20,17:20,39.0*C,29.3%
09/01/20,17:20,39.0*C,29.3%
09/01/20,17:20,39.0*C,29.3%
09/01/20,17:20,39.0*C,29.4%
09/01/20,17:20,39.0*C,29.3%
09/01/20,17:21,39.0*C,29.3%
09/01/20,17:21,39.0*C,29.3%
09/01/20,17:21,39.0*C,29.3%
09/01/20,17:21,39.0*C,29.3%
09/01/20,17:21,39.0*C,29.7%
==========================

Advice with explanations are appreciated.

TIA
Michael

gjr80

unread,
Sep 1, 2020, 6:55:13 PM9/1/20
to weewx-user
Hi,

If you already have code that is reading your sensors then it is a simple step to incorporate that code in to a WeeWX service framework and I would suggest that going down the fileparse route is un-needed complexity (plus fileparse is a driver not a service so you would need to recode the fileparse driver to operate as a service). 

In terms of what you have posted, your config file looks fine as does the code in your service. Assuming you have no errors/warnings in the log when running your service (do you?) I would start by looking closely at the working code that produces your csv file and the corresponding code in your service that appears not to work. There will be a difference/error there somewhere. Feel free to post your working code if you wish.

Gary

Tom Keffer

unread,
Sep 1, 2020, 7:07:43 PM9/1/20
to weewx-user
I agree with Gary. You can get this to work.

You put in a logging statement to log the values coming off of the DHT22. What does the log say? Are the values zero?

Is there a difference between how you produced the values for the csv file and how you are producing the values in the weewx service? 

There is one thing I still don't understand. The script starts with:

 def get_DHT22(self, event):
        sensor = Adafruit_DHT.DHT22()
        humidity, temperature = DHT.read_retry(DHT.DHT22, self.DHT22_pin)
        ...

What is DHT? It does not appear anywhere in the extra_sensor_service.py file. Adafruit_DHT appears, but not DHT. Are we seeing only part of the file?

-tk

--
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 weewx-user+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/weewx-user/1a28b1a4-444f-4133-8df9-f7f4e6cf3c2bo%40googlegroups.com.

Tom Keffer

unread,
Sep 1, 2020, 7:09:00 PM9/1/20
to weewx-user
Oh, one other thing: the csv file suggests that the values will be in metric units, that is, Celsius for temperature.

However, the LOOP packets have usUnits==1, which means they will be in US units. You will have to do a unit conversion.

-tk

Michael Grossie

unread,
Sep 1, 2020, 8:12:25 PM9/1/20
to weewx...@googlegroups.com
Below is the code (script) for the DHT22 Temperature/Humidity Sensor to log data in a CSV.
============================
#program to capture  data from the DHT22 Sensor and put into a file

import os
import time

import Adafruit_DHT

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4


try:
   f = open('/home/weewx/archive/humidity.csv', 'a+')
   if os.stat('/home/weewx/archive/humidity.csv').st_size == 0:
           f.write('Date,Time,Temperature,Humidity\r\n')
except:
    pass

while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)

    if humidity is not None and temperature is not None:
        f.write('{0},{1},{2:0.1f}*C,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'),
time.strftime('%H:%M'), temperature, humidity))
    else:
        print("Failed to retrieve data from humidity sensor")
 
    time.sleep (10)
===================== SYSLOG - Prior to the change in blue in the extra_sensors_service - previously posted
Sep  1 12:05:32 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
Sep  1 12:05:33 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
Sep  1 12:05:34 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
Sep  1 12:05:35 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
Sep  1 12:05:36 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
========================SYSLOG - After the change to the extra_sensors_service script - previously posted
Sep  1 18:51:31 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:32 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:33 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:34 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:35 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:36 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:37 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  1 18:51:38 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
================
Guess I will need some help on the converting temperature from celsius to fahrenheit and humidity from mbar to inHg also

TIA 

Michael H Grossie


You received this message because you are subscribed to a topic in the Google Groups "weewx-user" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/weewx-user/nsLIaQaK7IU/unsubscribe.
To unsubscribe from this group and all its topics, send an email to weewx-user+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/weewx-user/CAPq0zECcwOi8GJW4MYrxQ-8X%3D4w2-TJg6Oh6iUk6SoTOyKweHg%40mail.gmail.com.

Tom Keffer

unread,
Sep 1, 2020, 9:15:29 PM9/1/20
to weewx-user
As suspected. Try changing this

def get_DHT22(self, event):
        sensor = Adafruit_DHT.DHT22()
        humidity, temperature = DHT.read_retry(DHT.DHT22, self.DHT22_pin)
        ...

to this

def get_DHT22(self, event):
        sensor = Adafruit_DHT.DHT22()
        humidity, temperature = Adafruit_DHT.read_retry(DHT.DHT22, self.DHT22_pin)
        ...

The problem was the too-broad exception catch, which was catching (and swallowing) the TypeError exception. You should either get rid of the exception clause, or narrow it down to errors you actually expect.

Finally: the error was in the log all along. It's always a good idea to include the actual log, rather than simply summarize it.

-tk


Michael Grossie

unread,
Sep 2, 2020, 11:42:00 AM9/2/20
to weewx...@googlegroups.com
Tom;
Made the change that you suggested - Syslog shows:
Sep  2 10:35:47 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
Sep  2 10:35:48 raspberrypi weewxd: extrasensors: cannot read value: 'int' object is not callable
 
Trying to figure out where it sees "int" because I don't see it.
================================== extra_sensors_service.py
        humidity, temperature = Adafruit_DHT.read_retry(DHT.DHT22, self.DHT22_pin)

        if humidity is not None:
            syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found humidity value of %s %%" % humidity)
            event.packet['outHumidity'] = float(humidity)
        if temperature is not None:
            syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found temperature value of %s C" % temperature)
            # NOTE: stores as celsius
            event.packet['outTemp'] = float(temperature)
========================
Thanks

 
Michael H Grossie


Tom Keffer

unread,
Sep 2, 2020, 4:32:02 PM9/2/20
to weewx-user
If you remove the exception clause, the stack unwinding will show you exactly where the error is.

gjr80

unread,
Sep 2, 2020, 5:00:01 PM9/2/20
to weewx-user
The answer is pretty obvious if you compare the working code with the non-working service. You want:

DHT_SENSOR = Adafruit_DHT.DHT22

not

DHT_SENSOR = Adafruit_DHT.DHT22()

Gary

Michael Grossie

unread,
Sep 2, 2020, 7:47:54 PM9/2/20
to weewx...@googlegroups.com
Gary,

Made the change you suggested - 
From: DHT_SENSOR = Adafruit_DHT.DHT22()
To: DHT_SENSOR = Adafruit_DHT.DHT22
Now have this from the Syslog -
Sep  2 18:38:37 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
Sep  2 18:38:38 raspberrypi weewxd: extrasensors: cannot read value: global name 'DHT' is not defined
--------
Tom,
Is this the line you think I should remove from the extra_sensors_service.py -
 except Exception, e:
            syslog.syslog(syslog.LOG_ERR, "extrasensors: cannot read value: %s" % e)

 Michael H Grossie


Tom Keffer

unread,
Sep 2, 2020, 8:01:57 PM9/2/20
to weewx-user
Tom,
Is this the line you think I should remove from the extra_sensors_service.py -
 except Exception, e:
            syslog.syslog(syslog.LOG_ERR, "extrasensors: cannot read value: %s" % e) 

Yes (along with its corresponding 'try' statement).

It appears that you also have another "DHT" that is undefined. Removing the exception statement will show you exactly where it is. What you want in its place... I have no idea. Maybe your variable DHT_SENSOR?

Michael, this would go a lot faster if you do a critical review of your code, rather than relying on remote debugging.

-tk

-tk

Michael Grossie

unread,
Sep 4, 2020, 5:08:16 PM9/4/20
to weewx...@googlegroups.com
Tom, Gary
Got it working. Now just need to remove about 10 digits after the decimal in the outHumidity and convert the temperature from Celsius to Fahrenheit.
Also found that I had to run weewxd as python3 and not python.
The code that is working is below, suggestions on the humidity and temperature issues welcome -
========================extra_sensors_service
# Weewx Service to gather data from Adafruit_DHT. DHT22 Sensor  RUN AS python3

import syslog
import weewx
import time
import os
from weewx.wxengine import StdService
import Adafruit_DHT as DHT

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4
DHT22_PIN = 4


class ExtraSensorsService(StdService):
    def __init__(self, engine, config_dict):
        super(ExtraSensorsService, self).__init__(engine, config_dict)      
        d = config_dict.get('ExtraSensorsService', {})
        # Read from config which pin to use on the RPI GPIO
        # Defaults to 4
        self.DHT22_PIN = d.get('DHT22_PIN', 4)

        # Use the loop packet event as that allows data to still get into the WeeWX database
        # as well as supporting a OLED module on the RPI
        self.bind(weewx.NEW_LOOP_PACKET, self.load_data)
   
    def load_data(self, event):
#       try:
#            self.get_bmp180(event)
            self.get_dht22(event)
#       except Exception, e:
#            syslog.syslog(syslog.LOG_ERR, "extrasensors: cannot read value: %s" % e)

    # Get DHT22 data
    def get_DHT22(self, event):
        humidity, temperature = DHT.read_retry(DHT.DHT22, self.DHT22_PIN)

        if humidity is not None:
            syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found humidity value of %s %%" % humidity)
            event.packet['inHumidity'] = float(humidity)

        if temperature is not None:
            syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found temperature value of %s C" % temperature)
            # NOTE: stores as celsius
            event.packet['inTemp'] = float(temperature)
========================
 
Michael H Grossie


--
You received this message because you are subscribed to a topic in the Google Groups "weewx-user" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/weewx-user/nsLIaQaK7IU/unsubscribe.
To unsubscribe from this group and all its topics, send an email to weewx-user+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages