TK:  That did the trick, Many thanks!

Gary/TK:  As of right now, it has not been an issue, and my main server has 
plenty of CPU to handle it.  My dev environment is on a Pi1, so it feels 
the pinch a little bit.  Thank you for the additional information, that 
makes sense, and ill see about optimizing the order to reduce the number of 
calls, but I still have a catch built into the code so that it only runs 
once.

One other thing that I have run into both with the existing 'last' option, 
and the '5_min' option i wrote before we got this all squared away is that 
the first couple calls report None or N/A.  Any idea what could cause this? 
 I am running on a Pi1 like i said, so both CPU time and RAM is at a bit of 
a premium, and currently my catch only stops after a successful run, so I 
can easily work around it, but this is mainly for my own education.

On Sunday, June 25, 2017 at 4:14:28 PM UTC-6, Tom Keffer wrote:
>
> Geez, I've been on summer vacation too long. I don't know where that 
> "latest" came from. It should be 'last'. Unless, of course, you want some 
> other aggregation for the day
>
> stats.day().outTemp.last  Last temperature for the day.
> stats.day().outTemp.avg    Average temperature for the day
> stats.day().outTemp.max  Maximum temperature, etc.
>
> These aggregation types (last, avg, etc.) are not functions, so they 
> should not require parentheses. 
>
> -tk
>
>
> On Sun, Jun 25, 2017 at 2:51 PM, Thomas Carlin <[email protected] 
> <javascript:>> wrote:
>
>> That makes sense.  I feel like we are making progress.  At least the 
>> error keeps changing.  Now I am getting a KeyError: 'latest' on the same 
>> line.  I get the same thing when I use 'current()' or 'latest'  without (). 
>>   Traceback below:
>>
>> Traceback (most recent call last):
>>   File "/usr/share/weewx/weewx/reportengine.py", line 239, in run
>>     obj.start()
>>   File "/usr/share/weewx/weewx/reportengine.py", line 273, in start
>>     self.run()
>>   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 157, in run
>>     ngen = self.generate(gen_dict[section_name], self.gen_ts)
>>   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 231, in 
>> generate
>>     ngen += self.generate(section[subsection], gen_ts)
>>   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 231, in 
>> generate
>>     ngen += self.generate(section[subsection], gen_ts)
>>   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 319, in 
>> generate
>>     default_binding)
>>   File "/usr/share/weewx/weewx/cheetahgenerator.py", line 371, in 
>> _getSearchList
>>     searchList += obj.get_extension_list(timespan, db_lookup)
>>   File "/usr/share/weewx/user/gdanalyzer.py", line 66, in 
>> get_extension_list
>>     latest = stats.day().outTemp.latest()
>>   File "/usr/share/weewx/weewx/tags.py", line 326, in __getattr__
>>     return self._do_query(aggregate_type)
>>   File "/usr/share/weewx/weewx/tags.py", line 340, in _do_query
>>     val=val, **self.option_dict)
>>   File "/usr/share/weewx/weewx/wxmanager.py", line 60, in getAggregate
>>     return weewx.manager.DaySummaryManager.getAggregate(self, timespan, 
>> obs_type, aggregateType, **option_dict)
>>   File "/usr/share/weewx/weewx/manager.py", line 1270, in getAggregate
>>     _row = self.getSql(DaySummaryManager.sqlDict[aggregate_type] % 
>> interDict)
>> KeyError: 'latest'
>>
>>
>>
>> On Sunday, June 25, 2017 at 2:34:42 PM UTC-6, Tom Keffer wrote:
>>>
>>> Sorry. Forgot that "day 
>>> <https://github.com/weewx/weewx/blob/v3.7.1/bin/weewx/tags.py#L69>" is 
>>> actually a function. If Cheetah gets this error it swallows it, then 
>>> silently tries the attribute again, this time as a function, using default 
>>> arguments. You, programming in plain old Python, have no such luxury, so 
>>> you have to call it as a function the first time. I should note that "
>>> latest 
>>> <https://github.com/weewx/weewx/blob/v3.7.1/bin/weewx/tags.py#L364>" is 
>>> also a function, so it will also have to be called as one. The expression 
>>> becomes
>>>
>>> stats.day().outTemp.latest()
>>>
>>>
>>> If you follow the links for day and latest, you can see what optional 
>>> arguments they can take. 
>>>
>>> -tk
>>>
>>>
>>>
>>>
>>>
>>> On Sun, Jun 25, 2017 at 1:06 PM, Thomas Carlin <[email protected]> 
>>> wrote:
>>>
>>>> Thanks again Tom,
>>>>
>>>> Hopefully the last question for today!
>>>>
>>>> I currently have (truncated for brevity)
>>>>
>>>> from weewx.cheetahgenerator import SearchList
>>>> import weewx.tags
>>>>
>>>>
>>>> class GarageDoorAnalyzer(SearchList):
>>>>     def __init__(self, generator):
>>>>         SearchList.__init__(self, generator)
>>>>
>>>>
>>>>     def get_extension_list(self, timespan, db_lookup):
>>>>
>>>>         stats = weewx.tags.TimeBinder(
>>>>             db_lookup,
>>>>             timespan.stop,
>>>>             formatter=self.generator.formatter,
>>>>             converter=self.generator.converter)
>>>>
>>>>
>>>>         latest = stats.day.outTemp.latest
>>>>         print latest
>>>>
>>>>         self.search_list_extension[tag_name] = self.
>>>> _DoSomethingWithLatest(latest)
>>>>         return[self.search_list_extension]
>>>>        
>>>>
>>>>
>>>> When I run this, i get the following traceback:
>>>>
>>>> , line 67, in get_extension_list
>>>>     latest = stats.day.outTemp.latest
>>>> AttributeError: 'function' object has no attribute 'outTemp'
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Sunday, June 25, 2017 at 11:37:55 AM UTC-6, Tom Keffer wrote:
>>>>
>>>>> I cut-and-paste from the definition for function 
>>>>> Stats.get_extension_list() 
>>>>> <https://github.com/weewx/weewx/blob/v3.7.1/bin/weewx/cheetahgenerator.py#L537>.
>>>>>  
>>>>> You can see where trend_dict came from there. However, unless you 
>>>>> plan to use something like stats.trend in your search list extension 
>>>>> (unlikely), it, and several other parameters, can be safely left out. A 
>>>>> more minimal assignment for stats would look like:
>>>>>
>>>>> stats = weewx.tags.TimeBinder(
>>>>>             db_lookup,
>>>>>             timespan.stop,
>>>>>             formatter=self.generator.formatter,
>>>>>             converter=self.generator.converter)
>>>>>
>>>>> As for how often an SLE gets called, that depends on the usage 
>>>>> pattern. Without seeing the exact pattern you are using it's hard to say, 
>>>>> but something I see quite often is Cheetah expressions that look 
>>>>> something 
>>>>> like this (this came up today):
>>>>>
>>>>> #if $day.UV.has_data
>>>>>   <tr>
>>>>>   <td class="stats_label">UV</td>
>>>>>   #if $current.UV.raw <= 2.4
>>>>>     <td class="stats_data" style="background-color: 
>>>>> limegreen">$current.UV</td>
>>>>>   #else if $current.UV.raw >= 2.5 and $current.UV.raw <= 5.4
>>>>>     <td class="stats_data" style="background-color: 
>>>>> yellow">$current.UV</td>
>>>>>   #else if $current.UV.raw >= 5.5 and $current.UV.raw <= 7.4
>>>>>     <td class="stats_data" style="background-color: 
>>>>> orange">$current.UV</td>
>>>>>   #else if $current.UV.raw >= 7.5 and $current.UV.raw <= 10.4
>>>>>     <td class="stats_data" style="background-color: red">$current.UV</td>
>>>>>   #else if $current.UV.raw > 10.5
>>>>>     <td class="stats_data" style="background-color: 
>>>>> violet">$current.UV</td>
>>>>>   #end if
>>>>>   </tr>
>>>>> #end if
>>>>>
>>>>>
>>>>> This snippet will use the Current SLE up to eight times, just to get 
>>>>> the UV value.  If the UV value is not available in the current record, 
>>>>> that 
>>>>> means up to 8 SQL queries! A more efficient pattern is:
>>>>>
>>>>> #if $day.UV.has_data
>>>>>   #set $current_UV = $current.UV.raw
>>>>>   <tr>
>>>>>   <td class="stats_label">UV</td>
>>>>>   #if $current_UV <= 2.4
>>>>>     <td class="stats_data" style="background-color: 
>>>>> limegreen">$current.UV</td>
>>>>>   #else if $current_UV >= 2.5 and $current_UV <= 5.4
>>>>>     <td class="stats_data" style="background-color: 
>>>>> yellow">$current.UV</td>
>>>>>   #else if $current_UV >= 5.5 and $current_UV <= 7.4
>>>>>     <td class="stats_data" style="background-color: 
>>>>> orange">$current.UV</td>
>>>>>   #else if $current_UV >= 7.5 and $current_UV <= 10.4
>>>>>     <td class="stats_data" style="background-color: red">$current.UV</td>
>>>>>   #else
>>>>>     <td class="stats_data" style="background-color: 
>>>>> violet">$current.UV</td>
>>>>>   #end if
>>>>>   </tr>
>>>>> #end if
>>>>>
>>>>> -tk
>>>>>
>>>>>
>>>>>
>>>>> On Sun, Jun 25, 2017 at 9:49 AM, Thomas Carlin <[email protected]> 
>>>>> wrote:
>>>>>
>>>>>> Thanks Tom, that looks like exactly what I need.  Doing some testing 
>>>>>> this morning, I get an error on 
>>>>>> trend=trend_dict,
>>>>>>
>>>>>> NameError: global name 'trend_dict' is not defined
>>>>>>
>>>>>> Where does this dictionary originate?
>>>>>>
>>>>>> Unrelated to the original question, I noticed that my extension runs 
>>>>>> several times (7 i think) for each report generation.  It's trivial to 
>>>>>> write a catch in so it only runs once, but i'm curious why this is.  
>>>>>> Could 
>>>>>> you shed any light on this?
>>>>>>
>>>>>> -Thomas
>>>>>>
>>>>>>
>>>>>> On Saturday, June 24, 2017 at 8:25:07 PM UTC-6, Tom Keffer wrote:
>>>>>>>
>>>>>>> Not a simple question at all! 
>>>>>>>
>>>>>>> Generally, yes, you can use something similar to the tags in your 
>>>>>>> code by following the same path through the objects. For example,
>>>>>>>
>>>>>>> $day.outTemp.latest
>>>>>>>
>>>>>>> can be obtained by using 
>>>>>>>
>>>>>>>         stats = weewx.tags.TimeBinder(
>>>>>>>             db_lookup,
>>>>>>>             timespan.stop,
>>>>>>>             formatter=self.generator.formatter,
>>>>>>>             converter=self.generator.converter,
>>>>>>>             week_start=self.generator.stn_info.week_start,
>>>>>>>             rain_year_start=self.generator.stn_info.rain_year_start,
>>>>>>>             trend=trend_dict,
>>>>>>>             skin_dict=self.generator.skin_dict)
>>>>>>>
>>>>>>>             latest = stats.day.outTemp.latest
>>>>>>>
>>>>>>> This is basically all Cheetah is doing!
>>>>>>>
>>>>>>> Hope this helps.
>>>>>>>
>>>>>>> -tk
>>>>>>>
>>>>>>>
>>>>>>> On Sat, Jun 24, 2017 at 8:39 AM, Thomas Carlin <[email protected]> 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Good morning everyone,
>>>>>>>>
>>>>>>>> I have a custom search list extension that I am working on to do 
>>>>>>>> some analysis on my collected data, and I have it to the point that I 
>>>>>>>> am 
>>>>>>>> pulling the data out, and can manipulate it, but to do so, I had to 
>>>>>>>> define 
>>>>>>>> my own timespan/binder inside my script.  (The historygenerator 
>>>>>>>> extension 
>>>>>>>> does the same thing).
>>>>>>>>
>>>>>>>> Is there any way to use the weewx defined 'latest'  or 'current' 
>>>>>>>> timespan inside my python extension?  Please forgive me if this is a 
>>>>>>>> simple 
>>>>>>>> question, the only programing experience that I have is 
>>>>>>>> self-inflicted, and 
>>>>>>>> far from complete.
>>>>>>>>
>>>>>>>> Thank you!
>>>>>>>>
>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "weewx-user" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>> send an email to [email protected].
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "weewx-user" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "weewx-user" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "weewx-user" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to