This refers to https://groups.google.com/g/weewx-user/c/MHN64Ex2sTA/m/v6-Qp8D5AwAJ
I tried to write an XType extension for that. There are no error messages, but the value is not known to the record. The loop and archive record do not include a value called "GTS" or "GTSdate". I created a skin for testing, that includes the some simpley values, only. The result is shown in "index.html". I do not understand the result. The log says: Feb 13 20:45:32 LokalWiki weewx[541598] DEBUG weewx.engine: Loading service user.GTS.GTSType Feb 13 20:45:32 LokalWiki weewx[541598] DEBUG weewx.engine: Finished loading service user.GTS.GTSType It seems to me, that the extension is not called at all. I have no clue so far. -- You received this message because you are subscribed to the Google Groups "weewx-development" group. To unsubscribe from this group and stop receiving emails from it, send an email to weewx-development+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/weewx-development/0c5b8147-c2fd-42cc-96ae-fcb801b40accn%40googlegroups.com.
# Copyright 2021 Johanna Roedenbeck # calculating Grünlandtmperatursumme # deal with differences between python 2 and python 3 try: # Python 3 import queue except ImportError: # Python 2 # noinspection PyUnresolvedReferences import Queue as queue try: # Python 3 from urllib.parse import urlencode except ImportError: # Python 2 # noinspection PyUnresolvedReferences from urllib import urlencode import weedb import weewx import weewx.manager import weewx.units import weewx.xtypes from weeutil.weeutil import TimeSpan try: # Test for new-style weewx logging by trying to import weeutil.logger import weeutil.logger import logging log = logging.getLogger(__name__) def logdbg(msg): log.debug(msg) def loginf(msg): log.info(msg) def logerr(msg): log.error(msg) except ImportError: # Old-style weewx logging import syslog def logmsg(level, msg): syslog.syslog(level, 'GTS: %s' % msg) def logdbg(msg): logmsg(syslog.LOG_DEBUG, msg) def loginf(msg): logmsg(syslog.LOG_INFO, msg) def logerr(msg): logmsg(syslog.LOG_ERR, msg) class GTSType(weewx.xtypes.XType): def __init__(self,engine,config_dict): # class XType has no constructor #super(GTSType,self).__init() self.last_gts_date=None self.gts_date=None self.gts_value=None self.gts_values=[None]*151 weewx.units.obs_group_dict.setdefault('GTS','group_degree_day') weewx.units.obs_group_dict.setdefault('GTSdate','group_time') def get_scalar(self, obs_type, record, db_manager): if obs_type!='GTS' and obs_type!='GTSdate': raise weewx.UnknownType(obs_type) logdbg("obs_type=%s" % obs_type) # needed timestamps time_ts=record['dateTime'] _sod_ts = weeutil.weeutil.startOfDay(time_ts) # start of day if _sod_ts>time.time(): _sod_ts=weeutil.weeutil.startOfDay(time.time()) _soy_ts,_eoy_ts = weeutil.weeutil.archiveYearSpan(time_ts) # start of year _feb_ts = _soy_ts + 2678400 # Feb 1 _mar_ts = _feb_ts + 2419200 # Mar 1 (or Feb 29 in leap year) _end_ts = _mar_ts + 7948800 # Jun 1 (or May 31 in leap year) # initialize if program start or new year if self.last_gts_date is None or self.last_gts_date<_soy_ts or self.last_gts_date>=_eoy_ts: self.last_gts_date = _soy_ts self.gts_value = None self.gts_date = None self.gts_values=[None]*151 loginf("GTS initialized %s" % time.strftime("%Y-%m-%d", time.localtime(_soy_ts))) # calculate # This runs one loop for every day since New Year at program # start and after that once a day one loop, only. After May 31th # no loop is executed. _loop_ct=0 while self.last_gts_date < _sod_ts and self.last_gts_date < _end_ts: # the day the average is calculated for _today = TimeSpan(self.last_gts_date,self.last_gts_date+86400) # calculate the average of the outside temperature _result = weewx.xtypes.get_aggregate('outTemp',_today,'avg',dbmanager) # convert to centrigrade if _result is not None: _result = weewx.units.convert(_result,'degree_C') # check condition and add to sum if _result is not None and _result[0] is not None: if self.gts_value is None: self.gts_value=0 _dayavg = _result[0] if _dayavg > 0: if self.last_gts_date < _feb_ts: _dayavg *= 0.5 elif self.last_gts_date < _mar_ts: _dayavg *= 0.75 logdbg("loop no. %s, day value %s" % (_loop_ct,_dayavg)) self.gts_value += _dayavg self.gts_values[(self.last_gts_date-_soy_ts)/86400]=self.gts_value if self.gts_value >= 200 and self.gts_date is None: self.gts_date = self.last_gts_date # next day logdbg("loop no. %s, GTS so far %s" % (_loop_ct,self.gts_value)) self.last_gts_date += 86400 _loop_ct+=1 if _loop_ct>0: loginf("GTS %s, %s loops" % (self.gts_value,_loop_ct)) logdbg("x") if obs_type=='GTS': # Grünlandtemperatursumme GTS try: if time_ts>_end_ts: __x=self.gts_values[-1] else: __x=self.gts_values[(time_ts-_soy_ts)/86400] __x=weewx.units.convertStd( (__x,'degree_C_day','group_degree_day'), record['usUnits']) except (ValueError,TypeError,IndexError): raise weewx.CannotCalculate(obs_type) elif obs_type=='GTSdate': # date of value 200 if self.gts_date is None or _sod_ts<self.gts_date: return (None,'unix_epoch','group_time') else: return (self.gts_date,'unix_epoch','group_time') else: # unknown type (should not happen here) raise weewx.UnknownType(obs_type)