I know that this sounds insane, but my modified (to add some extra data derived from external sensors) weewx installation which has been running for a couple of months now crashes on startup. I stopped weewx to replace a (very) old Vantage Pro 2 ISS, removed the old unit, put the new unit in its place, reconfigured the console to communicate with the new unit, observed that the console was showing valid data, and restarted weewx, which is running on a Pi connected to the console via a MeteoPi. weewx immediately crashes, with the following exception tree, arising from my user code.
Traceback (most recent call last):
File "/usr/share/weewx/weewxd", line 261, in <module>
main()
File "/usr/share/weewx/weewxd", line 154, in main
engine.run()
File "/usr/share/weewx/weewx/engine.py", line 158, in run
self.dispatchEvent(weewx.Event(weewx.STARTUP))
File "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent
callback(event)
File "/usr/share/weewx/weewx/engine.py", line 530, in startup
self._catchup(self.engine.console.genStartupRecords)
File "/usr/share/weewx/weewx/engine.py", line 643, in _catchup
origin='hardware'))
File "/usr/share/weewx/weewx/engine.py", line 224, in dispatchEvent
callback(event)
File "/usr/share/weewx/user/NewTH.py", line 19, in read_file
event.record['extraTemp1'] = event.record['inTemp']
KeyError: 'inTemp'
It looks as if the event record no longer contains an 'inTemp' item, but why not??!! Again, this installation has been running for months, through multiple apt update/upgrades and reboots. The only thing that changed was the Vantage ISS - I'm using the same console that I always did. Does this make sense to anyone? I will try reverting to a standard weewx config, but even if this works, it doesn't really help - I want to use and save the extra data!
The contents of the user code source file are
import syslog
import weewx
import time
import os
from weewx.wxengine import StdService
class ArchTHService(StdService):
def __init__(self, engine, config_dict):
super(ArchTHService, self).__init__(engine, config_dict)
d = config_dict.get('ArchTHService', {})
self.filename = d.get('filename', '/var/tmp/THNow.txt')
self.filename2 = d.get('filename', '/var/tmp/THBNow.txt')
syslog.syslog(syslog.LOG_INFO, "ArchTH: using %s" % self.filename)
self.bind(weewx.NEW_ARCHIVE_RECORD, self.read_file)
def read_file(self, event):
# save the console values in 'extra' slots
event.record['extraTemp1'] = event.record['inTemp'] ## This is where it fails
event.record['extraHumid1'] = event.record['inHumidity']
try:
#skip it if it's stale. Console values will be used instead
if time.time() - os.path.getmtime("/var/tmp/THNow.txt") < 600: #10 minutes
with open(self.filename) as f:
line = f.read() # contains temp & humidity, comma-separated
values=line.split(',')
syslog.syslog(syslog.LOG_DEBUG, "ArchTH: found value of %s" % line)
event.record['inTemp'] = float(values[0])
event.record['inHumidity'] = float(values[1])
with open(self.filename2) as f:
line = f.read() # contains basement temp & humidity, comma-separated
values=line.split(',')
syslog.syslog(syslog.LOG_DEBUG, "ArchTH(B): found value of %s" % line)
event.record['extraTemp2'] = float(values[0])
event.record['extraHumid2'] = float(values[1])
except Exception as e:
syslog.syslog(syslog.LOG_ERR, "ArchTH: cannot interpret value: %s" % e)
class LoopTHService(StdService):
loopcount= 0
lastT = 0
lastH =0
def __init__(self, engine, config_dict):
super(LoopTHService, self).__init__(engine, config_dict)
d = config_dict.get('LoopTHService', {})
self.filename = d.get('filename', '/var/tmp/THNow.txt')
syslog.syslog(syslog.LOG_INFO, "LoopTH: using %s" % self.filename)
self.bind(weewx.NEW_LOOP_PACKET, self.read_file)
def read_file(self, event):
if self.loopcount == 0:
try:
#skip it if it's stale. Vantage Console values will be used instead
if time.time() - os.path.getmtime("/var/tmp/THNow.txt") < 300: #5 minutes
with open(self.filename) as f:
line = f.read() # contains temp & humidity, comma-separated
values=line.split(',')
syslog.syslog(syslog.LOG_DEBUG, "LoopTH: found value of %s" % line)
event.packet['inTemp'] = float(values[0])
event.packet['inHumidity'] = float(values[1])
self.lastT=float(values[0])
self.lastH=float(values[1])
self.loopcount += 1
except Exception as e:
syslog.syslog(syslog.LOG_ERR, "LoopTH: cannot interpret value: %s" % e)
else:
self.loopcount += 1
if self.loopcount >= 30:
self.loopcount = 0
event.packet['inTemp'] = self.lastT
event.packet['inHumidity'] = self.lastH