Hi Gary,

Following your previous replies & weewx 1st class documentation, I managed 
to get 'density' in my reports & database. I thank you for that !

But as the calculation for 'density' needs pressure (absolute in Pa) and my 
hardware (WS2812) is only returning a relative (to altitude) 'pressure' 
value, I needed to introduce an intermediate 'abspressure' value to my 
loop/archive records :

def new_loop_packet(self, event):

        if 'pressure' in event.packet :
            try:
                altitude_metric = 1326         # Need to get the 
'$Station.altitude' value (in meter) but how ?
                abspr = 100 * (event.packet['pressure'] * (1 - (0.0065 * 
altitude_metric / 288.15)) ** 5.255)

            except TypeError:
                abspr = None
            event.packet['abspressure'] = abspr


The above works fine, but instead of adding the new 'altitude_metric' 
variable, I'd prefer to use the elevation already set in weewx.conf, 
without knowing how to do so ?

Sorry if my question looks dumb, but as you can guess I have very little 
knowledge in Python, I understand 'station.elevation' beeing a Tuple 
(value, units, format) from which I have no idea on how to 1) call it in 
the above script and 2) isolate only its value for my calculation ?

Your help would be much appreciated ...

Yann
 

Le dimanche 30 septembre 2018 04:07:27 UTC+2, gjr80 a écrit :
>
> 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!
>>>>
>>>

-- 
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 weewx-development+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-development/d2996452-117b-472c-8eb5-12c977534dcfo%40googlegroups.com.

Reply via email to