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 [email protected].
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)