Hi

Thanks so much for your help, I have a better understanding and have 
managed to get it working by modifying your example as needed. 
Initially WeeWX crashed with a syntax error on *else *but guessed it needed 
to say *else:* after noticing *try:* (without googling it)

In my weewx.conf I have an entry under the generic labels section:
extraTemp3 = The Core Temperature (we nickname the cupboard where the 
router, etc sits as "the core")

Under [engine] [[service]] I added:
user.cupboardtemp.CupboardService

I'm not bothering to plot any graphs as I just want to quickly see how the 
cupboard is doing heat-wise on the main report:
http://www.achinton.co.uk

It turns out that temper-poll (which polls the Temper USB device) has a -c 
option which just returns the value in degrees C, I didn't need to filter 
anything before writing to the text file which the WeeWX service then reads.

At the moment I have a cron which runs every 10 minutes executing a bash 
script which contains:

*/usr/bin/python2 /usr/local/bin/temper-poll -c > /tmp/cupboardtemp.txt*

I should imagine there are more elegant ways of getting the data from the 
Temper USB directly within a WeeWX service, the temper-poll program was 
written in python as well so certainly something I'll have a play around 
with. Plus learning some Python is something I keep promising myself.

Thanks again,

Ashley











On Thursday, 25 June 2020 at 14:00:03 UTC+1 gjr80 wrote:

> Hi,
>
> There is one simple rule when adding/altering fields in a loop 
> packet/archive record; always take note of the unit system used by the 
> packet/record. Loop packets are emitted by the driver using a unit system 
> of the drivers choice, it does not matter what unit system is used and it 
> need bear no resemblance to the unit system used in the database or in any 
> reports (the StdConvert service takes care of converting packets/records 
> to the unit system used by the database and there are mechanisms within the 
> StdReport service for converting to whatever display units the user 
> wishes to use). If a WeeWX service wants to add a field to the loop packet 
> that service should check the unit system used in the packet and then 
> convert the data to be added to the appropriate units before adding the 
> data to the packet. In some cases it does not matter (eg humidity, 
> radiation, direction all use the same units across all unit systems) but 
> obviously it matters for temperatures, speeds, pressures etc. You can 
> certainly have your external source provide temperatures in C if your 
> driver is emitting temperatures in C but what happens if you get a new 
> station/driver that emits F? Such a chnage would result in your C data 
> being treated as if it was in F.
>
> So back to your system. The service that you write will need to do a 
> number of things. First it needs to read your data and know what units are 
> being used (units could be hard coded in your service or read from the 
> external source - its your source so you control it). Then you need to 
> check the unit system used in the record you are augmenting and convert 
> your data to the units used in the record. Finally you add the converted 
> data to the record. Using the example you linked your code might look 
> something like (untested):
>
> import syslog
> import weewx
> import weewx.units
> from weewx.wxengine import StdService
>
> class PondService(StdService):
>     def __init__(self, engine, config_dict):
>         super(PondService, self).__init__(engine, config_dict)      
>         d = config_dict.get('PondService', {})
>         self.filename = d.get('filename', '/var/tmp/pond.txt')
>         syslog.syslog(syslog.LOG_INFO, "pond: using %s" % self.filename)
>         self.bind(weewx.NEW_ARCHIVE_RECORD, self.read_file)
>
>     def read_file(self, event):
>         try:
>             with open(self.filename) as f:
>                 value = f.read()
>             value = float(value)            
>             syslog.syslog(syslog.LOG_DEBUG, "pond: found value of %s" % 
> value)
>         except Exception as e:
>             syslog.syslog(syslog.LOG_ERR, "pond: cannot read value: %s" % 
> e)
>         else
>             value_vt = weewx.units.ValueTuple(value, 'degree_C', 
> 'group_temperature')
>             conv_value_vt = weewx.units.convertStd(value_vt, event.record[
> 'usUnits'])
>             event.record['extraTemp1'] = conv_value_vt.value
>
> I have highlighted the changes in yellow. Firstly we import weewx.units 
> as we are going ot use some of the unit conversion functions that reside in 
> the WeeWX units module. The changed use of float() lets us make use of 
> the existing try..except to catch the error that would occur if the data 
> read cannot be converted to a number. The code indented under 'else' is 
> executed if the try..except does not encounter an error, in other words 
> the data is read and successfully converted to a number. Looking at the 
> 'else' code in detail, first we express the imported data as a ValueTuple, 
> this is a three element tuple that defines a value, its units and the unit 
> group it belongs to. This is necessary to use the WeeWX unit conversion 
> functions. In this case we know our imported data is in C and is a 
> temperature. We then call the convertStd function to convert that 
> ValueTuple into the units used by that particualr unit group in that 
> particular packet. There may be no conversion needed, but we know now that 
> irrespective of the unit system used in event.record, conv_value_vt 
> contains our imported data in the same temperature units used in 
> event.record. So we can just simply add the value to the record.
>
> Hopefully that gives you some hints on a way ahead.
>
> Gary
>
> On Wednesday, 24 June 2020 23:03:19 UTC+10, Ashley Hinton wrote:
>>
>> Hey everyone.
>>
>> I'm having a bit of a brain freeze over how to tell Weewx what units 
>> (metric or US) to expect when importing a temperature figure from a text 
>> file.
>> My set up uses Weewx version 3.9.2 running under Python2 (setup.py 
>> install method) on a Raspberry Pi 4, OS is Raspian Buster (Debian 10)
>>
>> I have two data sources at the moment:
>> The main weather station is an Aercus Instruments Weathersleuth which is 
>> basically a fine offset observer. That uses the Intercepter plugin 
>> /home/weewx/bin/user/interceptor.py
>> I also have two extra sensors feeding from another pi on the network 
>> using the One Wire (OWFS) plugin /home/weewx/bin/user/owfs.py - these are 
>> mapped as extraTemp1 & 2 and report as Greenhouse and Garage temperatures.
>>
>> As far as I'm aware all of those report the temperature as metric when 
>> polled by weewx and I don't recall having to modify anything.
>>
>> What I want to do is map a third, extraTemp3, to data from a Temper USB 
>> temperature sensor I've got in the cupboard where the Raspberry Pi sits 
>> (the one running Weewx) 
>>
>> All well and good, i've installed a python application which when called 
>> will report the temperature from the Temper.
>>
>> > temper-poll
>>
>> Found 1 devices
>>
>> Device #0: 39.7°C 103.4°F
>>
>> I'm sure I can write a bash script to run temper-poll, strip out unwanted 
>> data, and overwrite the result to a file in /tmp/ (such as cupboard.txt) - 
>> once happy I'll set up a cron for the script and then a service in 
>> /home/weewx/bin/user as per the example: 
>> https://github.com/weewx/weewx/wiki/add-sensor  - modifying as needed.
>>
>> As per notes within weewx.conf [StdConvert] has always remained as US 
>> units.
>>
>> What I can't figure out is how Weeex knows whether the incoming data, 
>> from any of the sensors across the system, are metric or US? is it 
>> specified within the service(s) themselves?
>> I notice further down in the example of adding an extra sensor::
>>
>> That is, whatever unit system you use in pond.txt, must match the unit 
>> system used by the incoming record. The unit system used by the incoming 
>> record will be given by event.record['usUnits']
>>
>> Does that mean I need to add the above to my new service?
>>
>> In short:
>> Both Interceptor and Owfs are presenting temperature data in degrees C, 
>> but the Weewx [stdConvert] is untouched from default (US)
>> My reports are in metric, but of course that's just the reports. I could 
>> change it at any time without affecting the database or the incoming sensor 
>> data to Weewx.
>> Do I need to do anything to my new service in /weewx/bin/user/ to specify 
>> that the data is metric or US depending on what value gets presented from 
>> /tmp/cupboard.txt ?
>>
>> I'm reluctant to just try it as I don't want incorrect data, even though 
>> this is just so I an easily see the temperature of the cupboard where my 
>> main "server" raspberry pi, router, network switch and a few other bits of 
>> kit reside. Ignore the alarmingly high temp as the stick is currently 
>> plugged directly into the pi and its a hot day here - a USB extension cable 
>> will give a more accurate reading of the ambient temp.
>>
>> Thanks for any help and guidance and of course apologies in advance if 
>> it's in the instructions (I did try a search - honest!)
>>
>> Regards
>>
>> Ashley
>>
>>
>>

-- 
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 weewx-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/986fc9bb-745e-445a-ad95-83ed428098acn%40googlegroups.com.

Reply via email to