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)

Reply via email to