cmon v0.16 crashes in weewx version 3.9.1
See crashlog:
Feb 14 11:10:15 pi21 vpro[28175]: manager: Added record 2019-02-14 11:10:15 -03 (1550153415) to database 'cmon21'
Feb 14 11:10:15 pi21 vpro[28175]: engine: Main loop exiting. Shutting engine down.
Feb 14 11:10:15 pi21 vpro[28175]: engine: Shutting down StdReport thread
Feb 14 11:10:15 pi21 vpro[28175]: engine: StdReport thread has been terminated
Feb 14 11:10:15 pi21 vpro[28175]: engine: Caught unrecoverable exception in engine:
Feb 14 11:10:15 pi21 vpro[28175]: **** accum: ScalarStats.addHiLo expected float or int, got 3809297
Feb 14 11:10:15 pi21 vpro[28175]: **** Traceback (most recent call last):
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/engine.py", line 890, in main
Feb 14 11:10:15 pi21 vpro[28175]: **** engine.run()
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/engine.py", line 202, in run
Feb 14 11:10:15 pi21 vpro[28175]: **** self.dispatchEvent(weewx.Event(weewx.POST_LOOP))
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/engine.py", line 224, in dispatchEvent
Feb 14 11:10:15 pi21 vpro[28175]: **** callback(event)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/engine.py", line 580, in post_loop
Feb 14 11:10:15 pi21 vpro[28175]: **** self._catchup(self.engine.console.genArchiveRecords)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/engine.py", line 635, in _catchup
Feb 14 11:10:15 pi21 vpro[28175]: **** origin='hardware'))
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/engine.py", line 224, in dispatchEvent
Feb 14 11:10:15 pi21 vpro[28175]: **** callback(event)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/user/cmon.py", line 714, in new_archive_record
Feb 14 11:10:15 pi21 vpro[28175]: **** self.save_data(self.get_data(now, self.last_ts))
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/user/cmon.py", line 721, in save_data
Feb 14 11:10:15 pi21 vpro[28175]: **** self.dbm.addRecord(record)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/manager.py", line 246, in addRecord
Feb 14 11:10:15 pi21 vpro[28175]: **** self._addSingleRecord(record, cursor, log_level)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/manager.py", line 1216, in _addSingleRecord
Feb 14 11:10:15 pi21 vpro[28175]: **** _day_summary.addRecord(record, weight=_weight)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/accum.py", line 256, in addRecord
Feb 14 11:10:15 pi21 vpro[28175]: **** func(self, record, obs_type, add_hilo, weight)
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/accum.py", line 314, in add_value
Feb 14 11:10:15 pi21 vpro[28175]: **** self[obs_type].addHiLo(val, record['dateTime'])
Feb 14 11:10:15 pi21 vpro[28175]: **** File "/home/weewx/bin/weewx/accum.py", line 77, in addHiLo
Feb 14 11:10:15 pi21 vpro[28175]: **** raise ValueError("accum: ScalarStats.addHiLo expected float or int, got %s" % val)
Feb 14 11:10:15 pi21 vpro[28175]: **** ValueError: accum: ScalarStats.addHiLo expected float or int, got 3809297
Feb 14 11:10:15 pi21 vpro[28175]: **** Exiting.
The problem is caused by the net_eth0_tbytes calculation in cmon.py, see below.
# get network usage
fn = '/proc/net/dev'
try:
netinfo = self._readproc_dict(fn)
if netinfo:
for iface in netinfo:
values = netinfo[iface].split()
for i, k in enumerate(self._NET_KEYS):
if iface not in self.last_net:
self.last_net[iface] = {}
if k in self.last_net[iface]:
x = int(values[i]) - self.last_net[iface][k]
if x < 0:
maxcnt = 0x100000000 # 32-bit counter
if x + maxcnt < 0:
maxcnt = 0x10000000000000000 # 64-bit counter
x += maxcnt
record['net_' + iface + '_' + k] = x
self.last_net[iface][k] = int(values[i])
except Exception, e:
logdbg("read failed for %s: %s" % (fn, e))
The value of net_eth0_tbytes is a long integer ('net_eth0_tbytes': 108233L,) and accum.py (of version 3.9.1) expects a float or an integer, but NOT a long.
To solve this, the cmon value must be converted to an integer in line 463 of cmon.py
record['net_' + iface + '_' + k] = int(x)
Luc