Nov 15 19:30:20 Ds-1 weewx[27964]: manager: Added record 2017-11-15 19:30:20 MST (1510799420) to database 'cmon.sdb'Nov 15 19:30:20 Ds-1 weewx[27964]: manager: Added record 2017-11-15 19:30:20 MST (1510799420) to daily summary in 'cmon.sdb'Nov 15 19:30:20 Ds-1 weewx[27964]: manager: Added record 2017-11-15 19:30:00 MST (1510799400) to database 'weewx.sdb'Nov 15 19:30:20 Ds-1 weewx[27964]: engine: Main loop exiting. Shutting engine down.Nov 15 19:30:20 Ds-1 weewx[27964]: engine: Shutting down StdReport threadNov 15 19:30:20 Ds-1 weewx[27964]: engine: StdReport thread has been terminatedNov 15 19:30:21 Ds-1 weewx[27964]: engine: Caught unrecoverable exception in engine:Nov 15 19:30:21 Ds-1 weewx[27964]: **** unsupported operand type(s) for +=: 'NoneType' and 'float'Nov 15 19:30:21 Ds-1 weewx[27964]: **** Traceback (most recent call last):Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 871, in mainNov 15 19:30:21 Ds-1 weewx[27964]: **** engine.run()Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 201, in runNov 15 19:30:21 Ds-1 weewx[27964]: **** self.dispatchEvent(weewx.Event(weewx.POST_LOOP))Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 223, in dispatchEventNov 15 19:30:21 Ds-1 weewx[27964]: **** callback(event)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 561, in post_loopNov 15 19:30:21 Ds-1 weewx[27964]: **** self._software_catchup()Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 633, in _software_catchupNov 15 19:30:21 Ds-1 weewx[27964]: **** self.engine.dispatchEvent(weewx.Event(weewx.NEW_ARCHIVE_RECORD, record=record, origin='software'))Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 223, in dispatchEventNov 15 19:30:21 Ds-1 weewx[27964]: **** callback(event)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/engine.py", line 588, in new_archive_recordNov 15 19:30:21 Ds-1 weewx[27964]: **** dbmanager.addRecord(event.record, accumulator=self.old_accumulator)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/manager.py", line 245, in addRecordNov 15 19:30:21 Ds-1 weewx[27964]: **** self._addSingleRecord(record, cursor, log_level)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/manager.py", line 1183, in _addSingleRecordNov 15 19:30:21 Ds-1 weewx[27964]: **** _day_summary.addRecord(record, weight=_weight)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/accum.py", line 242, in addRecordNov 15 19:30:21 Ds-1 weewx[27964]: **** func(self, record, obs_type, add_hilo, weight)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/accum.py", line 301, in add_valueNov 15 19:30:21 Ds-1 weewx[27964]: **** self[obs_type].addSum(val, weight=weight)Nov 15 19:30:21 Ds-1 weewx[27964]: **** File "/usr/share/weewx/weewx/accum.py", line 88, in addSumNov 15 19:30:21 Ds-1 weewx[27964]: **** self.sum += valNov 15 19:30:21 Ds-1 weewx[27964]: **** TypeError: unsupported operand type(s) for +=: 'NoneType' and 'float'Nov 15 19:30:21 Ds-1 weewx[27964]: **** Exiting.
I suspect the issue will be to do with one of the fields you have added to the weeWX archive. It appears that the 'sum' field for one of the accumulators is being initialised to None instead of 0.0 and consequently when an observation value is added you get the error shown in your logs. I don't think the issue is with the driver you wrote. Might help if we could get a better picture of your setup. Can you please provide a sanitised copy of weewx.conf along with details of the schema you are using for the archive table in your weex database.
Gary
schema_with_esp = schemas.wview.schema + [('DoorOpen1', 'REAL'), ('DoorClosed1', 'REAL'), ('DoorOpen2', 'REAL'), ('DoorClosed2', 'REAL'), ('IrrigationFlow', 'REAL'), ('IrrigationPressure', 'REAL'),('esp1Signal', 'REAL'), ('esp2Signal', 'REAL'), ('esp3Signal', 'REAL'), ('esp3LIPOVoltage', 'REAL'), ('esp3LIPOCurrent', 'REAL'), ('esp3SolarVoltage', 'REAL'), ('esp3SolarCurrent', 'REAL'), ('esp3OutputVoltage', 'REAL'), ('esp3OutputCurrent', 'REAL'), ('extraHumid3', 'REAL'), ('esp4Signal', 'REAL'), ('esp4LIPOVoltage', 'REAL')]
# WEEWX CONFIGURATION FILE## Copyright (c) 2009-2015 Tom Keffer# 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 zerodebug = 1
# Root directory of the weewx data file hierarchy for this stationWEEWX_ROOT = /
# How long to wait before timing out a socket (FTP, HTTP) connectionsocket_timeout = 20
# Do not modify this. It is used when installing and updating weewx.version = 3.7.1
##############################################################################
# This section is for information about the additional ESP8266 Sensors that are in use.
[ESP8266] [[http://1.2.3.4]] mac = 5C:CF:7F:02:0C:17 Temp = extraTemp1 Humid = extraHumid1 doorOpen = DoorOpen1 doorClosed = DoorClosed1 Signal = esp1Signal [[http://1.2.3.4]] mac = 5C:CF:7F:07:5B:90 Temp = extraTemp2 Humid = extraHumid2 doorOpen = DoorOpen2 doorClosed = DoorClosed2 Signal = esp2Signal
# [[http://1.2.3.4]]# mac = 30:AE:A4:30:93:54# Temp = extraTemp3# Humid = extraHumid3# Signal = esp4Signal# Voltage = esp4LIPOVoltage # [[http://1.2.3.4]]# mac = 5C:CF:7F:12:17:97# Flow = IrrigationFlow# Pressure = IrrigationPressure# Signal = esp3Signal# LIPO_Voltage = esp3LIPOVoltage# LIPO_Current = esp3LIPOCurrent# Solar_Voltage = esp3SolarVoltage# Solar_Current = esp3SolarCurrent# Output_Voltage = esp3OutputVoltage# Output_Current = esp3OutputCurrent
##############################################################################
# This section is for information about the station.
[Station] # Description of the station location location = y # Latitude and longitude in decimal degrees latitude = longitude = # Altitude of the station, with unit it is in. This is downloaded from # from the station if the hardware supports it. altitude = 1234, foot # 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 = Vantage # If you have a website, you may specify an URL #station_url = http://www.example.com # 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
##############################################################################
[Vantage] # This section is for the Davis Vantage series of weather stations. # Connection type: serial or ethernet # serial (the classic VantagePro) # ethernet (the WeatherLinkIP) type = ethernet # If the connection type is serial, a port must be specified: # Debian, Ubuntu, Redhat, Fedora, and SuSE: # /dev/ttyUSB0 is a common USB port name # /dev/ttyS0 is a common serial port name # BSD: # /dev/cuaU0 is a common serial port name port = /dev/ttyUSB0 # If the connection type is ethernet, an IP Address/hostname is required: host = 1.2.3.4 ###################################################### # The rest of this section rarely needs any attention. # You can safely leave it "as is." ###################################################### # Serial baud rate (usually 19200) baudrate = 19200 # TCP port (when using the WeatherLinkIP) tcp_port = 23 # TCP send delay (when using the WeatherLinkIP): #tcp_send_delay = 0.5 tcp_send_delay = 1 # The id of your ISS station (usually 1). If you use a wind meter connected # to a anemometer transmitter kit, use its id iss_id = 1 # How long to wait for a response from the station before giving up (in # seconds; must be greater than 2) timeout = 4 # How long to wait before trying again (in seconds) wait_before_retry = 1.2 # How many times to try before giving up: max_tries = 4 # The driver to use: driver = weewx.drivers.vantage
##############################################################################
# This section is for uploading data to Internet sites
##NOTHING HERE ##
##############################################################################
# This section specifies what reports, using which skins, to generate.
[StdReport] # Where the skins reside, relative to WEEWX_ROOT SKIN_ROOT = /etc/weewx/skins # Where the generated reports should go, relative to WEEWX_ROOT HTML_ROOT = /var/www/html/weewx # The database binding indicates which data should be used in reports. data_binding = wx_binding # Each of the following subsections defines a report that will be run. [[StandardReport]] # 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. # The StandardReport uses the 'Standard' skin, which contains the # images, templates and plots for the report. skin = Sofaskin [[[Units]]] [[[[Groups]]]] group_altitude = foot group_speed2 = mile_per_hour2 group_pressure = inHg group_rain = inch group_rainrate = inch_per_hour group_temperature = degree_F group_degree_day = degree_F_day group_speed = mile_per_hour #[[cmon]] # HTML_ROOT = /var/www/html/weewx/cmon # skin = cmon [[FTP]] ##NOTHING HERE ## [[RSYNC]]##NOTHING HERE ##
##############################################################################
# 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 outTemp = -40, 120, degree_F inTemp = 10, 120, degree_F outHumidity = 0, 100 inHumidity = 0, 100 windSpeed = 0, 120, mile_per_hour pressure = 24, 34.5, inHg
##############################################################################
# This section controls the origin of derived values.
[StdWXCalculate] [[Calculations]] # Derived quantities are calculated by this service. 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 barometer = prefer_hardware altimeter = prefer_hardware windchill = prefer_hardware heatindex = prefer_hardware dewpoint = prefer_hardware inDewpoint = prefer_hardware rainRate = 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 = software # 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.wxmanager.WXDaySummaryManager # The schema defines the structure of the database. # It is *only* used when the database is created. schema = user.esp8266.schema_with_esp [[cmon_binding]] manager = weewx.manager.DaySummaryManager schema = user.cmon.schema table_name = archive database = cmon_sqlite
##############################################################################
# This section defines various databases.
[Databases] # A SQLite database is simply a single file [[archive_sqlite]] database_type = SQLite database_name = weewx.sdb # MySQL [[archive_mysql]] database_type = MySQL database_name = weewx [[cmon_sqlite]] database_name = cmon.sdb database_type = SQLite
##############################################################################
# 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 = /var/lib/weewx # 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 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.esp8266.add_esp_records, process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate, weewx.engine.StdQC, weewx.wxservices.StdWXCalculate, user.cmon.ComputerMonitor 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
##############################################################################
# Options for extension 'cmon'[ComputerMonitor] data_binding = cmon_binding
sqlite> select * from archive_day_extraTemp3 where datetime >= 1510640000;
dateTime|min|mintime|max|maxtime|sum|count|wsum|sumtime1510642800|70.52|1510728900|78.26|1510721100|2935.64|40|880692.0|120001510729200|65.48|1510746000|78.08|1510779600|16512.56|232|4953768.0|696001510815600|67.28|1510842900|71.06|1510842000|2934.08|43|880224.0|129001510902000|||||0.0|0|0.0|01510988400|74.48|1511058300|83.12|1511039400||45||13500sqlite>
sqlite> select dateTime, inTemp, extraTemp3 from archive where datetime >= 1511057400;
dateTime|inTemp|extraTemp31511057400|70.6000000000002|75.021511057700|70.3999999999998|74.661511058000|70.3999999999998|74.661511058300|70.2767123287672|74.481511058600|70.2|1511069400|69.8092307692308|
for sensor in self.sensors: if sensor != 'mac':# print "DB Entry: " + self.sensors[sensor] try: value = esp_records[sensor] except KeyError: value = None
# print "Value: " + str(value) event.record[self.sensors[sensor]] = value
...DB Entry: extraTemp3Value: nanDB Entry: extraHumid3Value: nan...Unable to access http://192.168.2.105REC: 2017-11-19 12:38:00 MST (1511120280) ..., extraHumid3: nan, extraTemp1: 55.58, extraTemp3: nan, heatindex: 31.7143461695...
--
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+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+unsubscribe@googlegroups.com.
--
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/TE57NMTaIXw/unsubscribe.
To unsubscribe from this group and all its topics, send an email to weewx-user+unsubscribe@googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+unsubscribe@googlegroups.com.
--
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+unsubscribe@googlegroups.com.
val = float('nan')>>> isinstance(val, (float, int))
True
>>>>>> type(val)<type 'float'>
def addSum(self, val, weight=1):
"""Add a scalar value to my running sum and count."""
if val is not None:
+ if (not isinstance(val, (float, int))) or (math.isnan(val)):
+ raise ValueError("accum: Expected float or int, got %s" % val)
self.sum += val
self.count += 1
self.wsum += val * weight
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
Gary
str(val) == 'nan'
--
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+unsubscribe@googlegroups.com.
On Mon, Nov 20, 2017 at 9:47 PM, Thomas Carlin <thomas...@gmail.com> wrote:
True, didn't think about that. It's dirty, but
str(val) == 'nan'
would work also. Aside from isnan(), that is the most readable solution that I am aware of.
On Monday, November 20, 2017 at 8:33:28 PM UTC-7, gjr80 wrote:Might have to be careful we don't break python 2.5 compatibility, I think isnan() was introduced in python 2.6.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 weewx-user+...@googlegroups.com.