Alarm.py failing with TypeError: '<' not supported between instances of 'NoneType' and 'float'

50 views
Skip to first unread message

Mike Thompson

unread,
Jul 17, 2020, 8:59:10 AM7/17/20
to weewx-user
Hi,

To trap bad data I have a derivative of alarm.py that has been sucessully running for years on Python 2.7 and weewx 3.x.  I upgraded to weewx 4 and Python 3 a month or so ago and it has been running quite happily until a few days ago.
The bad data parameters have been triggered and badData.py has been called. The line that causes the issue is;
 if eval(self.expression, None, record):
and the error is;
 TypeError: '<' not supported between instances of 'NoneType' and 'float'

FYI I'm a Python novice and copy from working code then tweek to what I need and iterate to a result!

I looked at Alarm.py in the examples directory and Customisation guide and the offending line is the same as in my badData.py. So I'm assuming that syntax is OK for Python3

The error message is objecting to comparing a float to a None. I'm not sure why this is an issue now when it's run for several years.

My bad data test is for a temp under 10 or wind gust over 100
In weewx.conf:
badData_test = outTemp < 10.0 or windGust > 100
as it complaining about the < then it's the outTemp variable that's coming through as non numeric.

Lokking in the archive table around the time of the crash I can see a null record for outTemp and windGust
sqlite> select datetime, outtemp, windgust from archive where datetime > 1594530300 and datetime < 1594531800;
1594530600|43.34|0.0
1594530900||
1594531319|43.52|0.0
1594531619|43.52|0.0
I have had null values whilst running python2

I'm not sure where to go from here, help!


Configuration:
Maplin/Fine Offset weather station been running since 2013
Raspberry PI 1B running Buster
Python 3.7.3


1 . badData.py - attached

2. extracts from Weewx.conf:

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

#   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 = ,
        process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate, weewx.engine.StdQC, weewx.wxservices.StdWXCalculate
        archive_services = weewx.engine.StdArchive, user.forecast.ZambrettiForecast, user.forecast.WUForecast, user.forecast.NWSFor$
        restful_services = weewx.restx.StdWunderground, weewx.restx.StdWOW, weewx.restx.StdPWSweather, weewx.restx.StdCWOP, weewx.r$
        report_services = weewx.engine.StdPrint, weewx.engine.StdReport, user.alarm.MyAlarm, user.badData.MyBadData

[Alarm]
    expression = " inHumidity > 90.0"
    time_wait = 86400
    smtp_host = xxxx
    smtp_user = xxxx
    smtp_password = xxxx
    mailto = xxxx
    from = xxxx
    subject = Humidity over 90!
    badData_test = outTemp < 10.0 or windGust > 100
    badData_subject = Weather Station spike detected



3. extrract from syslog at time of the crash

Jul 12 06:10:29 weepi weewx[513] INFO weewx.restx: WOW: Published record 2020-07-12 06:10:00 BST (1594530600)
Jul 12 06:10:29 weepi weewx[513] INFO weewx.restx: Wunderground-PWS: Published record 2020-07-12 06:10:00 BST (1594530600)
Jul 12 06:10:45 weepi weewx[513] INFO weewx.cheetahgenerator: Generated 8 files for report SeasonsReport in 14.87 seconds
Jul 12 06:10:52 weepi weewx[513] INFO weewx.imagegenerator: Generated 15 images for report SeasonsReport in 7.48 seconds
Jul 12 06:10:52 weepi weewx[513] INFO weewx.reportengine: Copied 0 files to /home/weewx/public_html
Jul 12 06:10:54 weepi weewx[513] INFO weewx.cheetahgenerator: Generated 6 files for report SmartphoneReport in 0.84 seconds
Jul 12 06:10:56 weepi weewx[513] INFO weewx.imagegenerator: Generated 6 images for report SmartphoneReport in 2.36 seconds
Jul 12 06:10:56 weepi weewx[513] INFO weewx.reportengine: Copied 0 files to /home/weewx/public_html/smartphone
Jul 12 06:10:57 weepi weewx[513] INFO weewx.cheetahgenerator: Generated 1 files for report MobileReport in 0.38 seconds
Jul 12 06:10:59 weepi weewx[513] INFO weewx.imagegenerator: Generated 4 images for report MobileReport in 1.66 seconds
Jul 12 06:10:59 weepi weewx[513] INFO weewx.reportengine: Copied 0 files to /home/weewx/public_html/mobile
Jul 12 06:11:03 weepi weewx[513] INFO weewx.cheetahgenerator: Generated 3 files for report exfoliation in 3.55 seconds
Jul 12 06:11:10 weepi weewx[513] INFO weewx.imagegenerator: Generated 15 images for report exfoliation in 6.91 seconds
Jul 12 06:11:10 weepi weewx[513] INFO weewx.reportengine: Copied 0 files to /home/weewx/public_html/exfoliation
Jul 12 06:15:31 weepi weewx[513] INFO weewx.manager: Added record 2020-07-12 06:15:00 BST (1594530900) to database 'weewx.sdb'
Jul 12 06:15:31 weepi weewx[513] INFO weewx.manager: Added record 2020-07-12 06:15:00 BST (1594530900) to daily summary in 'weewx.sdb'
Jul 12 06:15:31 weepi /weewxd: forecast: MainThread: Zambretti: starting thread
Jul 12 06:15:31 weepi /weewxd: forecast: MainThread: UKMO: starting thread
Jul 12 06:15:31 weepi weewx[513] INFO weewx.engine: Main loop exiting. Shutting engine down.
Jul 12 06:15:31 weepi weewx[513] INFO weewx.engine: Shutting down StdReport thread
Jul 12 06:15:31 weepi weewx[513] INFO weewx.restx: WOW: Published record 2020-07-12 06:15:00 BST (1594530900)
Jul 12 06:15:31 weepi weewx[513] INFO weewx.restx: Wunderground-PWS: Published record 2020-07-12 06:15:00 BST (1594530900)
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__: Caught unrecoverable exception:
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****  '<' not supported between instances of 'NoneType' and 'float'
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****  Traceback (most recent call last):
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 195, in run
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****      self.dispatchEvent(weewx.Event(weewx.CHECK_LOOP, packet=packet))
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 224, in dispatchEvent
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****      callback(event)
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 578, in check_loop
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****      raise BreakLoop
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****  weewx.engine.BreakLoop
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     **** 
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     ****  During handling of the above exception, another exception occurred:
Jul 12 06:15:31 weepi weewx[513] CRITICAL __main__:     **** 
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****  Traceback (most recent call last):
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 154, in main
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      engine.run()
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 202, in run
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      self.dispatchEvent(weewx.Event(weewx.POST_LOOP))
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 224, in dispatchEvent
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      callback(event)
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 588, in post_loop
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      self._software_catchup()
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 658, in _software_catchup
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      origin='software'))
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 224, in dispatchEvent
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      callback(event)
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "/home/weewx/bin/user/badData.py", line 94, in newArchiveRecord
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****      if eval(self.expression, None, record):                       # NOTE 2
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****    File "<string>", line 1, in <module>
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****  TypeError: '<' not supported between instances of 'NoneType' and 'float'
Jul 12 06:15:32 weepi weewx[513] CRITICAL __main__:     ****  Exiting.
Jul 12 06:17:01 weepi CRON[32233]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jul 12 06:17:33 weepi systemd[1]: Starting Daily apt upgrade and clean activities...
Jul 12 06:17:40 weepi systemd[1]: apt-daily-upgrade.service: Succeeded.

Thanks in Advance

badData.py

Tom Keffer

unread,
Jul 17, 2020, 9:41:18 AM7/17/20
to weewx-user
Instead of

outTemp < 10.0 or windGust > 100

try

(outTemp is not None and outTemp < 10.0) or( windGust is not None and windGust > 100)

-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/d77920b8-55ec-487b-9d21-579edf931e74o%40googlegroups.com.

Mike Thompson

unread,
Jul 17, 2020, 11:29:43 AM7/17/20
to weewx-user
Thanks Tom I didn't think of catching it in the expression doh!

I'll try and trap none as well with
outTemp is None or outTemp < 10.0 or windGust is None or windGust > 100

All I need now is some bad data lol

Mike
To unsubscribe from this group and stop receiving emails from it, send an email to weewx...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages