I think it might be worth taking a couple of steps back here and having a look at what you are trying to do, if not for your benefit then for mine. As I understand it you have started with a weatherflow driver that picks up UDP packets and emits that data in loop packets for WeeWX to ingest. This driver requires WeeWX to operate with software record generation as the driver only emits loop packets. You have taken that driver and extended it to pick up historical data via a REST interface. The aim of this is to give the driver the ability to emit historical archive records so that if WeeWX loses connection to the UDP packets WeeWX can catchup when connection is restored. When I became involved in the conversation you were working on implementing the genArchiveRecords() method in your driver, presumably as a path to being able to have WeeWX backfill/catchup if WeeWX loses the UDP connection. Do I have this correct?
I gave some earlier advice that in order to be able to catchup/backfill you need implement genArchiveRecords(), that is not strictly true. In order for WeeWX to be able to catchup the driver needs to have a genStartupRecords() method. It so happens that if you look at the base class of your driver, weewx.drivers.AbstractDevice <https://github.com/weewx/weewx/blob/master/bin/weewx/drivers/__init__.py#L12>, you will see that your driver will have inherited a genStartupRecords() method from the base class but it simply calls the genArchiveRecords() method. So by implementing your genArchiveRecords() method you have automatically given your driver a (functional) genStartupRecords() method. Nothing wrong with that but as you have found with the type of station the weatherflow is (there are no explicit archive records available, you need to construct them) you get some odd behaviour when genArchiveRecords() is implemented. What I suspect your really want is to implement genStartupRecords() and genLoopPackets() but NOT implement genArchiveRecords() and operate WeeWX with software record generation. To do this all you would do is move your genArchiveRecords() code to genStartupRecords() and remove the genArchiveRecords() class definition from your driver (just let it inherit the genArchiveRecords() method from the base class). This will result in the driver emitting loop packets (as the original driver does) and WeeWX accumulating these loop packets, synthesising archive records and saving the archive records to the database archive table. No archive records are emitted by the driver during normal operation. If the UDP connection is lost and later restored then when WeeWX restarts it will call the genStartupRecords() method with the last known timestamp in the archive table and the genStartupRecords() method will then emit all archive records since this timestamp. WeeWX will store these archive records in the database archive table. Once the catchup is completed normal driver operation resumes and WeeWX continues processing loop packets. Does that make sense? Gary -- You received this message because you are subscribed to the Google Groups "weewx-development" 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-development/1415d8ec-644e-4216-9a21-4a36f71a27d5n%40googlegroups.com.
