I don't think you'll need genSql(). If you were trying to calculate an
aggregate that required seeing every record and doing some complex
calculation in Python, then, yes.

But, your aggregate is simple enough that you can actually do the whole
thing in an SQL query, so getSql() should suffice.

Later, if you decide you want an optimized version of get_series(), then it
might be useful.

While I have you: consider another name besides "chillHours." That strongly
suggests that it will always be in hours, which is not necessarily true.
How about "chillTime"?

If you want to donate something, donate to my "real" project: Western Flyer
<https://www.westernflyer.org/>.

On Fri, Jan 21, 2022 at 4:24 PM Seth Ratner <lordrat...@gmail.com> wrote:

> Ok thanks. So I just learned what a python generator is. Cleared up a lot.
>
> Dude, I am seriously floored by how much you put into programming this.
> I'm back-tracking my way through the code for answers, and the detail is
> mind-blowing. Do you have a donations link?
>
> I'll reply once I have a functioning draft. Now that I understand how to
> use the genBatchRecords generator, I should have a working xType soon
>
> Then someone will have to explain the difference between scalar, series,
> and aggregate to me...
>
> Thanks!
>
> On Friday, January 21, 2022 at 6:07:28 PM UTC-6 tke...@gmail.com wrote:
>
>> Not sure why you would want to do this for times only one hour apart.
>>
>> Try something like this (NOT TESTED, and highly schematic):
>>
>>     def get_aggregate(obs_type, timespan, aggregate_type, db_manager,
>> **option_dict):
>>         if obs_type != 'chillHours':
>>             raise weewx.UnknownType(obs_type)
>>         if aggregate_type != 'sum':
>>             return weewx.UnknownAggregation(aggregate_type)
>>
>>         # Convert 45 to the same unit as the database:
>>         baseline = weewx.units.convertStd(ValueTuple(45, 'degree_F',
>> 'group_temperature'),
>>                                           db_manager.std_unit_system)
>>         result = db_manager.getSql("SELECT SUM(`interval`) * 60 WHERE
>> outTemp<=? AND dateTime BETWEEN ? AND ?",
>>                           baseline.value, *timespan)
>>
>>         # Check if result are None.
>>         # Get the proper unit and group, return as a ValueTuple.
>>
>> Note that the type "interval" is escaped with backquotes. This is because
>> in MySQL, "interval" is a keyword unless you escape it.
>>
>> Assigning the results to either group_elapsed seems reasonable.
>>
>> Another option would be "group_deltatime", which is normally used for
>> things like system uptime. If you print it out, the results should come
>> back as "20 days, 7 hours, 15 minutes", which is what you want.
>>
>> -tk
>>
>> On Fri, Jan 21, 2022 at 2:56 PM Seth Ratner <lordr...@gmail.com> wrote:
>>
>>> Closer and Closer, lol
>>>
>>> row = db_manager.getSql(sql_stmt)
>>>
>>> Using: SELECT outTemp FROM archive WHERE dateTime BETWEEN 1642744800 AND
>>> 1642748400
>>>
>>> Is returning a single outTemp. I am not sure how to return multiple rows
>>> then iterate through them to check for == chilhour and add them together. I
>>> know how to do it in PHP, but not WeeWX...
>>>
>>> I think once I get that, I'll be there. It would be simpler to put
>>> chillHours in the archive then I could just use sum(chillHours) in the sql
>>> query, but I'd rather not at this point, to make the xtype more flexible.
>>>
>>>
>>> On Friday, January 21, 2022 at 4:48:30 PM UTC-6 tke...@gmail.com wrote:
>>>
>>>> Oooh. That's a perfect example! Thanks, John.
>>>>
>>>> On Fri, Jan 21, 2022 at 2:29 PM 'John Kline' via weewx-user <
>>>> weewx...@googlegroups.com> wrote:
>>>>
>>>>> Another example:
>>>>>
>>>>>
>>>>> https://github.com/chaunceygardiner/weewx-purple/blob/e7f214539b63281d74af9e90810045dd8d1b7b80/bin/user/purple.py#L538
>>>>>
>>>>> On Jan 21, 2022, at 2:01 PM, Seth Ratner <lordr...@gmail.com> wrote:
>>>>>
>>>>> It looks like there is an example in the  weewx-xaggs
>>>>> <https://github.com/tkeffer/weewx-xaggs> repository. I'm about to
>>>>> dive in, but from a cursory look, unlike with the scalar, I'm going to 
>>>>> have
>>>>> to figure out how to use dbmanager to pull the outtemps from the database
>>>>> then iterate through each one, determine which ones are chill hours, and
>>>>> then add those together, correct?
>>>>>
>>>>> On Friday, January 21, 2022 at 3:49:33 PM UTC-6 tke...@gmail.com
>>>>> wrote:
>>>>>
>>>>>> Let me see if I can come up with something. Give me some time.
>>>>>>
>>>>>> On Fri, Jan 21, 2022 at 1:37 PM Seth Ratner <lordr...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Oh boy...
>>>>>>>
>>>>>>> I cant find any examples for that. If one exists, it will greatly
>>>>>>> reduce the number of questions I have...
>>>>>>>
>>>>>>> On Friday, January 21, 2022 at 3:24:07 PM UTC-6 tke...@gmail.com
>>>>>>> wrote:
>>>>>>>
>>>>>>>> You're getting close!
>>>>>>>>
>>>>>>>> You're going to have to implement get_aggregate(), as well as
>>>>>>>> get_scalar().
>>>>>>>>
>>>>>>>> The xtypes framework has no way of taking the calculation for
>>>>>>>> get_scalar() and using it to calculate an aggregate. You're going to 
>>>>>>>> have
>>>>>>>> to do it.  The good news is that once you've done it, then the 
>>>>>>>> framework
>>>>>>>> can use that to calculate a series on its own. This is where we will 
>>>>>>>> find
>>>>>>>> out how fast the calculation is.
>>>>>>>>
>>>>>>>> -tk
>>>>>>>>
>>>>>>>> On Fri, Jan 21, 2022 at 12:51 PM Seth Ratner <lordr...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Getting Closer, but still getting errors.
>>>>>>>>>
>>>>>>>>> I can now see the result in the archive loop (gets sent over
>>>>>>>>> MQTT). But with the seasons skin attempts to make a chart with it, I 
>>>>>>>>> get:
>>>>>>>>>
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine: Caught unrecoverable exception in generator
>>>>>>>>> 'weewx.imagegenerator.ImageGenerator'
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****  chillHours
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****  Traceback (most recent call last):
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****    File
>>>>>>>>> "/usr/share/weewx/weewx/reportengine.py", line 196, in run
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****      obj.start()
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****    File
>>>>>>>>> "/usr/share/weewx/weewx/reportengine.py", line 281, in start
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****      self.run()
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****    File
>>>>>>>>> "/usr/share/weewx/weewx/imagegenerator.py", line 41, in run
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****      self.genImages(self.gen_ts)
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****    File
>>>>>>>>> "/usr/share/weewx/weewx/imagegenerator.py", line 177, in genImages
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****      start_vec_t, stop_vec_t 
>>>>>>>>> ,data_vec_t =
>>>>>>>>> weewx.xtypes.get_series(var_type,
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****    File
>>>>>>>>> "/usr/share/weewx/weewx/xtypes.py", line 94, in get_series
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****      raise 
>>>>>>>>> weewx.UnknownType(obs_type)
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****  weewx.UnknownType: chillHours
>>>>>>>>> Jan 21 14:40:39 Ratner-Orchard weewx[3122] ERROR
>>>>>>>>> weewx.reportengine:         ****  Generator terminated
>>>>>>>>>
>>>>>>>>> Here's the block I added in skin.conf
>>>>>>>>>
>>>>>>>>> [[[yearchill]]]
>>>>>>>>>             plot_type = bar
>>>>>>>>>             [[[[chillHours]]]]
>>>>>>>>>                 aggregate_type = cumulative
>>>>>>>>>                 aggregate_interval = day
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Friday, January 21, 2022 at 2:14:11 PM UTC-6 Seth Ratner wrote:
>>>>>>>>>
>>>>>>>>>> I'm close, I think, except now I'm getting this every loop or
>>>>>>>>>> report generation.
>>>>>>>>>>
>>>>>>>>>> DEBUG weewx.wxservices: Unknown extensible type 'chillHours'
>>>>>>>>>>
>>>>>>>>>> There are a couple things I'm unsure of that might be causing this
>>>>>>>>>>
>>>>>>>>>> - I used the group type group_elapsed because it seemed like the
>>>>>>>>>> best fit
>>>>>>>>>> - The last line of the python file, modeled after the
>>>>>>>>>> VaporPressure.py example, is not part of either class, so I'm not 
>>>>>>>>>> sure what
>>>>>>>>>> runs it.
>>>>>>>>>>
>>>>>>>>>> Here's the code:
>>>>>>>>>> https://github.com/lordratner/weewx_chillHours/blob/main/chill_hours.py
>>>>>>>>>>
>>>>>>>>>> It's been added to weewx.conf engine section in xtypes, and I've
>>>>>>>>>> confirmed the service is loading.
>>>>>>>>>>
>>>>>>>>>> Thoughts?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Thursday, January 20, 2022 at 8:26:59 PM UTC-6
>>>>>>>>>> tke...@gmail.com wrote:
>>>>>>>>>>
>>>>>>>>>>> I'd try it as a pure xtype first, and see what kind of
>>>>>>>>>>> performance I got. If it's slow, put it in the database.
>>>>>>>>>>>
>>>>>>>>>>> You can query the database directly, but the advantage of using
>>>>>>>>>>> xtypes system to do your queries is that it can automatically 
>>>>>>>>>>> optimize
>>>>>>>>>>> whether or not to use the daily summaries.
>>>>>>>>>>>
>>>>>>>>>>> There's a brief section
>>>>>>>>>>> <https://github.com/weewx/weewx/wiki/WeeWX-V4-user-defined-types#xtypes-api>
>>>>>>>>>>> in the wiki about the API. It's pretty self-explanatory, except 
>>>>>>>>>>> about where
>>>>>>>>>>> db_manager comes from. That's an instance of
>>>>>>>>>>> weewx.manager.DaySummaryManager. Look in weewx/manager.py for how 
>>>>>>>>>>> to create
>>>>>>>>>>> one. There are some convenient static methods for doing so.
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Jan 20, 2022 at 6:15 PM Seth Ratner <
>>>>>>>>>>> se...@lordratner.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Thanks Tom
>>>>>>>>>>>>
>>>>>>>>>>>> Final questions for the night, I promise 🤣😂
>>>>>>>>>>>>
>>>>>>>>>>>> Would you put this one the database, or just let WeeWx
>>>>>>>>>>>> calculate it using the xtype each time?
>>>>>>>>>>>>
>>>>>>>>>>>> Second, is there an API or interface or whatever where another
>>>>>>>>>>>> application can query WeeWX for some sort of weather data? In this 
>>>>>>>>>>>> case,
>>>>>>>>>>>> I'd like my irrigation software to query WeeWX for the ET, total 
>>>>>>>>>>>> rain, and
>>>>>>>>>>>> chill hours of a given time frame.
>>>>>>>>>>>>
>>>>>>>>>>>> Or do I just have to read the database directly?
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Jan 20, 2022, 19:15 Tom Keffer <tke...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> On Thu, Jan 20, 2022 at 4:01 PM Seth Ratner <
>>>>>>>>>>>>> lordr...@gmail.com> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Would you add the step from the xType guide of adding
>>>>>>>>>>>>>> chillHours to [StdWXCalculate] [[Calculations]]? Or would the 
>>>>>>>>>>>>>> "synthetic
>>>>>>>>>>>>>> type" concept mean it only exists when it is called on.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> As I understand it, adding it to [StdWXCalculate]
>>>>>>>>>>>>>> [[Calculations]] would add chillHours to the loop, but it would 
>>>>>>>>>>>>>> not be in
>>>>>>>>>>>>>> the archive unless I also added a column for it with the same 
>>>>>>>>>>>>>> type name.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> It doesn't hurt to add to StdWXCalculate, but it's really
>>>>>>>>>>>>> only necessary if you want to add the results to the database.
>>>>>>>>>>>>>  And, yes, it will only get added to the database if there's
>>>>>>>>>>>>> a matching column in the schema.
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> So on my Belchertown skin, where I want total Chill Hours
>>>>>>>>>>>>>> from Oct - May displayed, if I add it to the archive WeeWX will 
>>>>>>>>>>>>>> use the
>>>>>>>>>>>>>> database to calculate the total (just adding them together), 
>>>>>>>>>>>>>> whereas if I
>>>>>>>>>>>>>> don't add it to the archive, WeeWX will have to run the (if 
>>>>>>>>>>>>>> outTemp < 45
>>>>>>>>>>>>>> then chillHours = archive_interval) for every archive row in 
>>>>>>>>>>>>>> that timespan,
>>>>>>>>>>>>>> then sum that?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Maybe. For the ImageGenerator that comes with WeeWX, if a type
>>>>>>>>>>>>> is not available in the database, it will try to calculate it "on 
>>>>>>>>>>>>> the fly"
>>>>>>>>>>>>> using xtypes. However, I have no idea what the Belchertown skin 
>>>>>>>>>>>>> does. I
>>>>>>>>>>>>> kind of doubt it leverages xtypes.
>>>>>>>>>>>>> -tk
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>> You received this message because you are subscribed to a
>>>>>>>>>>>>> topic in the Google Groups "weewx-user" group.
>>>>>>>>>>>>> To unsubscribe from this topic, visit
>>>>>>>>>>>>> https://groups.google.com/d/topic/weewx-user/7ysYvSUMOOo/unsubscribe
>>>>>>>>>>>>> .
>>>>>>>>>>>>> To unsubscribe from this group and all its topics, send an
>>>>>>>>>>>>> email to weewx-user+...@googlegroups.com.
>>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>>> https://groups.google.com/d/msgid/weewx-user/CAPq0zEAdDBGTow7i55XfnGPzncQjdmiH%2BSk%3DL9_ZoE85QXKO%3Dw%40mail.gmail.com
>>>>>>>>>>>>> <https://groups.google.com/d/msgid/weewx-user/CAPq0zEAdDBGTow7i55XfnGPzncQjdmiH%2BSk%3DL9_ZoE85QXKO%3Dw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>> .
>>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>>
>>>>>>>>>>> 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 weewx-user+...@googlegroups.com.
>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>> https://groups.google.com/d/msgid/weewx-user/CAHTssjOF_Q65XveoboAwRV%2Br5-oNb8curD7LZTTmuD7Y0-EAjQ%40mail.gmail.com
>>>>>>>>>>>> <https://groups.google.com/d/msgid/weewx-user/CAHTssjOF_Q65XveoboAwRV%2Br5-oNb8curD7LZTTmuD7Y0-EAjQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>> .
>>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>> 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 weewx-user+...@googlegroups.com.
>>>>>>>>>
>>>>>>>> To view this discussion on the web visit
>>>>>>>>> https://groups.google.com/d/msgid/weewx-user/cb666588-aced-461c-9171-9d48b89e85f5n%40googlegroups.com
>>>>>>>>> <https://groups.google.com/d/msgid/weewx-user/cb666588-aced-461c-9171-9d48b89e85f5n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>> --
>>>>>>> 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 weewx-user+...@googlegroups.com.
>>>>>>>
>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/weewx-user/8bb5d647-2f69-42b5-b5db-5b4c901e32f5n%40googlegroups.com
>>>>>>> <https://groups.google.com/d/msgid/weewx-user/8bb5d647-2f69-42b5-b5db-5b4c901e32f5n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>> --
>>>>> 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 weewx-user+...@googlegroups.com.
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/weewx-user/5c169c50-b9aa-4986-b2cc-0d58494b6665n%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/weewx-user/5c169c50-b9aa-4986-b2cc-0d58494b6665n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>> --
>>>>> 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 weewx-user+...@googlegroups.com.
>>>>>
>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/weewx-user/A8392819-685E-4BA1-93BD-BEAAF6D888C5%40johnkline.com
>>>>> <https://groups.google.com/d/msgid/weewx-user/A8392819-685E-4BA1-93BD-BEAAF6D888C5%40johnkline.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>> --
>>> 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 weewx-user+...@googlegroups.com.
>>>
>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/weewx-user/d6e37e32-94a3-4220-8bf7-8503a3f23d3cn%40googlegroups.com
>>> <https://groups.google.com/d/msgid/weewx-user/d6e37e32-94a3-4220-8bf7-8503a3f23d3cn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> 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 weewx-user+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/weewx-user/53c49b11-447f-45e4-952d-72a2c36e3eden%40googlegroups.com
> <https://groups.google.com/d/msgid/weewx-user/53c49b11-447f-45e4-952d-72a2c36e3eden%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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 weewx-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/CAPq0zEChFfVvCwJkdH5_nLUhScydoq-p2dgAmepTWs_ECHJNpw%40mail.gmail.com.

Reply via email to