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.
