Tom,

That worked perfectly.

Thank you very much for your help.

Ian

On Tue, 17 Nov 2020 at 19:39, Tom Keffer <[email protected]> wrote:

> You're taking the example too literally. It has an option 'algorithm',
> which your extension does not.
>
>    def __init__(self, engine, config_dict):
>         super(LastNonZeroService, self).__init__(engine, config_dict)
>
>         # Instantiate an instance of LastNonZero:
>         self.nz = LastNonZero()
>         # Register it:
>         weewx.xtypes.xtypes.append(self.nz)
>
>
> Secondly, lastnonzero is an aggregation type, not an observation type.
> So, it should not be added to obs_group_dict.
>
>
> On Tue, Nov 17, 2020 at 9:51 AM steeple ian <[email protected]> wrote:
>
>> Thanks Tom,
>>
>> I set your code up as a service following the vaporpressure.py example
>> and get the following errors on restart: -
>>
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****    File "/usr/share/weewx/weewxd", line 148, in main
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****      engine = weewx.engine.StdEngine(config_dict)
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****    File "/usr/share/weewx/weewx/engine.py", line 81, in __init__
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****      self.loadServices(config_dict)
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****    File "/usr/share/weewx/weewx/engine.py", line 153, in loadServices
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****    File "/usr/share/weewx/user/lastnonzero.py", line 84, in __init__
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****      self.nz = LastNonZero(algorithm)
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****  TypeError: LastNonZero() takes no arguments
>> Nov 17 17:39:15 raspberrypi python3[7172]: weewx[7172] CRITICAL __main__:    
>>  ****  Exiting.
>>
>>
>>
>> Code is below
>>
>> #
>> #    Copyright (c) 2020 Tom Keffer <[email protected]>
>> #
>> #    See the file LICENSE.txt for your full rights.
>> #
>> """This example shows how to extend the XTypes system with a new type,
>> lastnonzero, the last non-null or non-zero in a record
>>
>> REQUIRES WeeWX V4.2 OR LATER!
>>
>> To use:
>>     1. Stop weewxd
>>     2. Put this file in your user subdirectory.
>>     3. In weewx.conf, subsection [Engine][[Services]], add LastNonZero to
>> the list
>>     "xtype_services". For example, this means changing this
>>
>>         [Engine]
>>             [[Services]]
>>                 xtype_services = weewx.wxxtypes.StdWXXTypes,
>> weewx.wxxtypes.StdPressureCooker, weewx.wxxtypes.StdRainRater
>>
>>     to this:
>>
>>         [Engine]
>>             [[Services]]
>>                 xtype_services = weewx.wxxtypes.StdWXXTypes,
>> weewx.wxxtypes.StdPressureCooker, weewx.wxxtypes.StdRainRater,
>> user.lastnonzero.LastNonZeroService
>>
>>     4. Optionally, add the following section to weewx.conf:
>>         [LastNonZero]
>>             algorithm = simple   # Or tetens
>>
>>     5. Restart weewxd
>>
>> """
>> from weewx.engine import StdService
>> import weedb
>> import weewx.xtypes
>> import datetime
>>
>> class LastNonZero(weewx.xtypes.XType):
>>
>>     def get_aggregate(self, obs_type, timespan, aggregate_type,
>> db_manager, **option_dict):
>>         if aggregate_type != 'lastnonzero':
>>             raise weewx.UnknownAggregation(aggregate_type)
>>
>>         interpolate_dict = {
>>             'aggregate_type': aggregate_type,
>>             'obs_type': obs_type,
>>             'table_name': db_manager.table_name,
>>             'start': timespan.start,
>>             'stop': timespan.stop
>>         }
>>
>>         select_stmt = "SELECT %(obs_type)s FROM %(table_name)s " \
>>                       "WHERE dateTime > %(start)s AND dateTime <=
>> %(stop)s " \
>>                       "AND %(obs_type)s IS NOT NULL " \
>>                       "AND %(obs_type)s != 0 " \
>>                       "ORDER BY dateTime DESC LIMIT 1" % interpolate_dict
>>
>>         try:
>>             row = db_manager.getSql(select_stmt)
>>         except weedb.NoColumnError:
>>             raise weewx.UnknownType(obs_type)
>>
>>         value = row[0] if row else None
>>
>>         u, g =
>> weewx.units.getStandardUnitType(db_manager.std_unit_system, obs_type,
>>                                                aggregate_type)
>>         return weewx.units.ValueTuple(value, u, g)
>>
>> class LastNonZeroService(StdService):
>>     """ WeeWX service whose job is to register the XTypes extension
>> LastNonZero with the
>>     XType system.
>>     """
>>
>>     def __init__(self, engine, config_dict):
>>         super(LastNonZeroService, self).__init__(engine, config_dict)
>>
>>         # Get the desired algorithm. Default to "simple".
>>         try:
>>             algorithm = config_dict['LastNonZero']['algorithm']
>>         except KeyError:
>>             algorithm = 'simple'
>>
>>         # Instantiate an instance of LastNonZero:
>>         self.nz = LastNonZero(algorithm)
>>         # Register it:
>>         weewx.xtypes.xtypes.append(self.nz)
>>
>>     def shutDown(self):
>>         # Remove the registered instance:
>>         weewx.xtypes.xtypes.remove(self.nz)
>>
>>
>> # Tell the unit system what group our new observation type, 'lastnonzero,
>> belongs to:
>> weewx.units.obs_group_dict['lastnonzero'] = "group_distance"
>>
>> On Tue, 17 Nov 2020 at 16:06, Tom Keffer <[email protected]> wrote:
>>
>>> Then you would have to write an xtypes extension
>>> <https://github.com/weewx/weewx/wiki/WeeWX-V4-user-defined-types>.
>>>
>>> It would look something like this (NOT TESTED):
>>>
>>> import weedb
>>> import weewx.xtypes
>>>
>>> class LastNonZero(weewx.xtypes.XType):
>>>
>>>     def get_aggregate(self, obs_type, timespan, aggregate_type,
>>> db_manager, **option_dict):
>>>         if aggregate_type != 'lastnonzero':
>>>             raise weewx.UnknownAggregation(aggregate_type)
>>>
>>>         interpolate_dict = {
>>>             'aggregate_type': aggregate_type,
>>>             'obs_type': obs_type,
>>>             'table_name': db_manager.table_name,
>>>             'start': timespan.start,
>>>             'stop': timespan.stop
>>>         }
>>>
>>>         select_stmt = "SELECT %(obs_type)s FROM %(table_name)s " \
>>>                       "WHERE dateTime > %(start)s AND dateTime <=
>>> %(stop)s " \
>>>                       "AND %(obs_type)s IS NOT NULL " \
>>>                       "AND %(obs_type)s != 0 " \
>>>                       "ORDER BY dateTime DESC LIMIT 1" % interpolate_dict
>>>
>>>         try:
>>>             row = db_manager.getSql(select_stmt)
>>>         except weedb.NoColumnError:
>>>             raise weewx.UnknownType(obs_type)
>>>
>>>         value = row[0] if row else None
>>>
>>>         u, g =
>>> weewx.units.getStandardUnitType(db_manager.std_unit_system, obs_type,
>>>                                                aggregate_type)
>>>         return weewx.units.ValueTuple(value, u, g)
>>>
>>> Then you could use it:
>>>
>>> <p>This month's last non-null and non-zero temperature is
>>> $month.outTemp.lastnonzero</p>
>>>
>>>
>>>
>>> On Tue, Nov 17, 2020 at 6:46 AM steeple ian <[email protected]>
>>> wrote:
>>>
>>>> Thanks Tom,
>>>>
>>>> It worked fine, I did actually try that and it returned a zero (not
>>>> realising I had a zero in the database) and thought it had not worked
>>>> correctly. So if I want to eliminate the zeros as well?
>>>>
>>>> On Tue, 17 Nov 2020 at 12:38, Tom Keffer <[email protected]> wrote:
>>>>
>>>>> The aggregation type 'last' should do what you want:
>>>>>
>>>>> <p>The last non-null temperature this month is: $month.outTemp.last</p>
>>>>>
>>>>>
>>>>> On Tue, Nov 17, 2020 at 4:25 AM [email protected] <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Trying to find a 'WeeWX way' to find the last non-NULL record from
>>>>>> the database using a .tmpl file.
>>>>>>
>>>>>> Nothing obvious jumps out for me from the documentation. Does anybody
>>>>>> have any ideas?
>>>>>>
>>>>>> Thanks,
>>>>>> Ian
>>>>>>
>>>>>> --
>>>>>> 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].
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/weewx-user/6f4aed6f-824c-4ea3-8114-0c979e2e263cn%40googlegroups.com
>>>>>> <https://groups.google.com/d/msgid/weewx-user/6f4aed6f-824c-4ea3-8114-0c979e2e263cn%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 [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/weewx-user/CAPq0zEDUB8krNBpD88f%3Do2ARnr5O_0%3DKd5mhvWRRMG%3DN5dotzw%40mail.gmail.com
>>>>> <https://groups.google.com/d/msgid/weewx-user/CAPq0zEDUB8krNBpD88f%3Do2ARnr5O_0%3DKd5mhvWRRMG%3DN5dotzw%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 [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/weewx-user/CADASSaQHNqwQ8RumEkeBOpSh7bEumo%3DG-hC3XuyiiHMa9tkdvg%40mail.gmail.com
>>>> <https://groups.google.com/d/msgid/weewx-user/CADASSaQHNqwQ8RumEkeBOpSh7bEumo%3DG-hC3XuyiiHMa9tkdvg%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 [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/weewx-user/CAPq0zECTU7Nn6g3c%2BdiQFQyKpum0gKT7NEaV3ybpeMW11zfL9Q%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/weewx-user/CAPq0zECTU7Nn6g3c%2BdiQFQyKpum0gKT7NEaV3ybpeMW11zfL9Q%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 [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/weewx-user/CADASSaRMwg1PvFhCL411QQoXqM23N0neCe-WdBcJauKY4se7%2Bw%40mail.gmail.com
>> <https://groups.google.com/d/msgid/weewx-user/CADASSaRMwg1PvFhCL411QQoXqM23N0neCe-WdBcJauKY4se7%2Bw%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 [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/weewx-user/CAPq0zECU2CkPzNEFTesL41o0KzWjs6g3Nf3KYGmv3uToCUOLmA%40mail.gmail.com
> <https://groups.google.com/d/msgid/weewx-user/CAPq0zECU2CkPzNEFTesL41o0KzWjs6g3Nf3KYGmv3uToCUOLmA%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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/CADASSaSvtAZSmXpF_0FfzO2VoZQdq%2BuKw0%3D%3DFwMB%3D8vZOTn5rQ%40mail.gmail.com.

Reply via email to