Jacob,

Not sure where the csv file comes into it, does your RPi produce a csv file 
that the file parse driver then reads? Or are we talking about something 
else? Also not sure what you refer to when you use the term 'driver', is 
that the driver for your weather station (file parse?) or the code for the 
service I mentioned above? Perhaps a brief description of your system/WeeWX 
config would help.

In any case, the standard approach taken by WeeWX is that drivers read data 
from sensors, do any raw processing needed to decode sensor readings then 
package up and emit data as either a WeeWX format loop packet and/or 
archive record. Any calculated/derived obs are added later via a WeeWX 
service. At the end of the day nothing is going to break if a driver adds 
derived obs, its just the convention that has been adopted (largely to keep 
a consistent approach with how derived obs are calculated).

If it were me I would have the driver I am using emit only the direct 
sensor obs, ie temperature from a temperature sensor, rain from a rain 
gauge. Derived obs such as dewpoint, windchill and density altitude I would 
add later via a service. WeeWX already adds a number of derived obs by 
default (eg windchill and dewpoint) to loop packets and archive records if 
they do not exist in the packet/record. This is done via the StdWXCalculate 
service <http://weewx.com/docs/usersguide.htm#StdWXCalculate>. To add 
density altitude I would use a custom service like I outlined above, if you 
add services rather than modifying core WeeWX code your customisations 
remain across upgrades, otherwise they will be lost. I would then customise 
my db schema to add density altitude, once you have density altitude in 
your db schema and once you have density altitude in loop packets/archive 
records WeeWX will automatically save density altitude to the db. You can 
then use density altitude and aggregates thereof in your reports and you 
can also use density altitude in plots.

Gary

On Sunday, 30 September 2018 04:50:35 UTC+10, Jacob Wood wrote:
>
> Thank you for the reply Gary.  Managed to get the driver to calculate the 
> density altitude and output it to the same csv file with all the other 
> readings.  Would I still need to add the service, or what would be the best 
> way to add my custom data field into the loop packets and archive?
>
> Thank You
> Jacob
>
> On Saturday, September 22, 2018 at 7:42:20 PM UTC-6, gjr80 wrote:
>>
>> Hi Jacob,
>>
>> What you want to do with density altitude is straight forward though 
>> there are a few steps involved and you will need to get your hands into 
>> some python. Firstly some background.
>>
>> Displaying a current obs value on a page/in a report merely needs us to 
>> add the obs to the loop packets and/or archive records 
>> <http://weewx.com/docs/customizing.htm#_________LOOP_packets_vs._archive_records_______>
>>  generated 
>> by WeeWX. For density altitude this would be best done by writing a custom 
>> service that adds density altitude to the WeeWX generated loop packets. 
>> WeeWX will then accumulate the density altitude data over an archive period 
>> and include density altitude in the WeeWX generated archive record. It 
>> won't be saved to the database but it will allow you to use the current 
>> value (using the tag $current.densityAltitude - assumes the density 
>> altitude data observation is named densityAltitude) in a WeeWX generated 
>> report. To be able to plot density altitude or include aggregates such as 
>> min/max etc you need to save density altitude to the database. This can be 
>> done in a number of ways but is best done by customizing the WeeWX database 
>> schema.
>>
>> If you have a read through the sections Customizing the weeWX service 
>> engine <http://weewx.com/docs/customizing.htm#service_engine> and 
>> Customizing 
>> the database <http://weewx.com/docs/customizing.htm#archive_database> 
>> you will get a bit of an idea of the concepts involved. The examples in 
>> these sections are similar to what you will need to do.
>>
>> Creating a data service is quite easy, it can be as simple as something 
>> like the following (untested):
>>
>> import weewx
>> from weewx.engine import StdService
>>
>> class DensityAltitude(StdService):
>>
>>     def __init__(self, engine, config_dict):
>>
>>       # Initialize my superclass first:
>>       super(DensityAltitude, self).__init__(engine, config_dict)
>>
>>       # Bind to any new archive record events:
>>       self.bind(weewx.NEW_LOOP_PACKET, self.new_loop_packet)
>>
>>       self.last_total = None
>>
>>     def new_loop_packet(self, event):
>>
>>         if 'outTemp' in event.packet and 'outHumidity' in event.packet:
>>             try:
>>                 da = event.packet['outTemp'] + 2.0 * event.packet[
>> 'outHumidity']
>>             except TypeError:
>>                 da = None
>>             event.packet['densityAltitude'] = da
>>
>> Whilst this code uses a nonsense formula, it shows the basics of what you 
>> need to do. It creates a new service class based on class StdService, 
>> initialises the class and importantly binds itself to the NEW_LOOP_PACKET 
>> event which means we can intercept the WeeWX generated loop packet, use the 
>> data contained in it and add our new observation to it. The work is done in 
>> the new_loop_packet() method, this does a simple calculation and adds the 
>> value to the loop packet. There is a bit of checking to make sure the 
>> pre-requisites exist, the try..except is there to pickup if any of the 
>> pre-requisites exist but are None. Note that the WeeWX approach adding obs 
>> is if a source does not exist then don't add the obs, if the source exists 
>> but is not working (eg a failed sensor) then add the obs but set it to 
>> None, if the source exists and is functioning then add the obs value. 
>> Translated to a derived obs we would omit the derived obs if it's 
>> pre-requisites don't exist, add it as None if the pre-requisites exist 
>> but we cannot calculate a value and of course add the calculated value if 
>> all pre-requisites exist and the calculation can be completed. The loop 
>> packet is accessible via event.packet which is a python dictionary 
>> containing the loop packet data. You can view the fields available in your 
>> loop packets by running WeeWX directly 
>> <http://weewx.com/docs/usersguide.htm#Running_directly> and observing 
>> the LOOP: lines (REC: lines show the archive records).
>>
>> Having the code is great but to get WeeWX to use it you need to save it 
>> to a file, say /home/weewx/bin/user/da.py (user code is best saved to the 
>> /home/weewx/bin/user directory as this directory is protected during a 
>> WeeWX upgrade). You then add the new service to the WeeWX service list in 
>> weewx.conf as follows:
>>
>>
>> [Engine]
>>     
>>     [[Services]]
>>         # This section specifies the services that should be run. They 
>> are
>>         # grouped by type, and the order of services within each group
>>         # determines the order in which the services will be run.
>>         prep_services = weewx.engine.StdTimeSynch
>>         data_services = user.da.DensityAltitude
>>         process_services = weewx.engine.StdConvert, weewx.engine.
>> StdCalibrate, weewx.engine.StdQC, weewx.wxservices.StdWXCalculate
>>         archive_services = weewx.engine.StdArchive
>>         restful_services = weewx.restx.StdStationRegistry, weewx.restx.
>> StdWunderground, weewx.restx.StdPWSweather, weewx.restx.StdCWOP, weewx.
>> restx.StdWOW, weewx.restx.StdAWEKAS
>>         report_services = weewx.engine.StdPrint, weewx.engine.StdReport
>>
>> Restart WeeWX (run it directly) and you should see field densityAltitude 
>> appear in both loop packets and archive records.
>>
>> You can modify the database schema so that density altitude is stored in 
>> the database by following steps in Modifying the database 
>> <http://weewx.com/docs/customizing.htm#archive_database>, just change 
>> the names to suit.
>>
>> There are a few other gotchas that I am sure will come up, for example 
>> units (eg what if the loop packet temperature is in F and you need C for a 
>> formula - easily dealt with but not necessary for this walk through) but we 
>> can deal with them later, just get the concepts clear in your mind for now.
>>
>> In any case, see how you go digesting the above and feel free to ask more 
>> questions.
>>
>> Gary
>>
>> On Sunday, 23 September 2018 08:53:02 UTC+10, Jacob Wood wrote:
>>>
>>> I would like to show density altitude and display an image graph on the 
>>> weewx html page.
>>>
>>> I'm running a raspberry pi with an i2c sensor.
>>>
>>> I'm guessing the best way would be to have it calculated in software 
>>> (formula 
>>> here 
>>> <https://en.wikipedia.org/wiki/Density_altitude#The_National_Weather_Service_(NWS)_Formula>),
>>>  
>>> how dewpoint is calculated?  I just don't understand when and where weewx 
>>> calculates dewpoint and records it to a database.
>>>
>>> I do have very little experience debian/python and everything else, so 
>>> any help would be appreciated!
>>>
>>

Reply via email to