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.