Consolidated unit conversions into module weewx.units

This commit is contained in:
Tom Keffer
2016-10-04 06:38:11 -07:00
parent 5fce84c701
commit 71dccd2d11
8 changed files with 65 additions and 65 deletions

View File

@@ -55,15 +55,12 @@ import syslog
import time
import weewx.drivers
from weewx.units import INHG_PER_MBAR, MILE_PER_KM
from weeutil.weeutil import timestamp_to_string
DRIVER_NAME = 'Ultimeter'
DRIVER_VERSION = '0.16'
INHG_PER_MBAR = 0.0295299830714
METER_PER_FOOT = 0.3048
MILE_PER_KM = 0.621371
DEBUG_SERIAL = 0
def loader(config_dict, _):

View File

@@ -17,6 +17,7 @@ from __future__ import with_statement
import syslog
import time
from weewx.units import INHG_PER_MBAR, MILE_PER_KM
import weewx.drivers
DRIVER_NAME = 'WS1'
@@ -30,10 +31,6 @@ def confeditor_loader():
return WS1ConfEditor()
INHG_PER_MBAR = 0.0295299830714
METER_PER_FOOT = 0.3048
MILE_PER_KM = 0.621371
DEFAULT_SER_PORT = '/dev/ttyS0'
DEFAULT_TCP_ADDR = '192.168.36.25'
DEFAULT_TCP_PORT = 3000

View File

@@ -117,7 +117,7 @@
</tr>
<tr>
<td>Barometer (normal)</td>
<td>1042.2 mbar</td>
<td>1042.3 mbar</td>
</tr>
<tr>
<td>Barometer trend (3 hours)</td>
@@ -125,11 +125,11 @@
</tr>
<tr>
<td>Barometer using $latest</td>
<td>1042.2 mbar</td>
<td>1042.3 mbar</td>
</tr>
<tr>
<td>Barometer using $latest and explicit data binding</td>
<td>1029.0 mbar at 1283538000</td>
<td>1029.1 mbar at 1283538000</td>
</tr>
<tr>
<td>Wind Chill (normal)</td>

View File

@@ -71,7 +71,7 @@ class ConverterTest(unittest.TestCase):
'barometer' : 1002.3,
'usUnits' : weewx.METRIC}
d_us = {'outTemp' : 68.018,
'barometer' : 1002.3 / 33.86,
'barometer' : 1002.3 * weewx.units.INHG_PER_MBAR,
'usUnits' : weewx.US}
c = weewx.units.Converter()
d_test = c.convertDict(d_m)

View File

@@ -15,6 +15,29 @@ import weewx
import weeutil.weeutil
from weeutil.weeutil import ListOfDicts
# Handy conversion constants and functions:
INHG_PER_MBAR = 0.0295299875
MM_PER_INCH = 25.4
CM_PER_INCH = MM_PER_INCH / 10.0
METER_PER_MILE = 1609.34
METER_PER_FOOT = METER_PER_MILE / 5280.0
MILE_PER_KM = 1000.0 / METER_PER_MILE
def CtoK(x):
return x + 273.15
def CtoF(x):
return x * 1.8 + 32.0
def FtoC(x):
return (x - 32.0) * 5.0 / 9.0
def mps_to_mph(x):
return x * 3600.0 / METER_PER_MILE
def kph_to_mph(x):
return x * 1000.0 / METER_PER_MILE
class UnknownType(object):
"""Indicates that the observation type is unknown."""
def __init__(self, obs_type):
@@ -198,10 +221,10 @@ MetricWXUnits['group_speed2'] = "meter_per_second2"
# Conversion functions to go from one unit type to another.
conversionDict = {
'inHg' : {'mbar' : lambda x : x * 33.86,
'hPa' : lambda x : x * 33.86,
'inHg' : {'mbar' : lambda x : x / INHG_PER_MBAR,
'hPa' : lambda x : x / INHG_PER_MBAR,
'mmHg' : lambda x : x * 25.4},
'degree_F' : {'degree_C' : lambda x : (x-32.0) * (5.0/9.0)},
'degree_F' : {'degree_C' : FtoC},
'degree_F_day' : {'degree_C_day' : lambda x : x * (5.0/9.0)},
'mile_per_hour' : {'km_per_hour' : lambda x : x * 1.609344,
'knot' : lambda x : x * 0.868976242,
@@ -217,24 +240,24 @@ conversionDict = {
'meter_per_second2': lambda x : x * 0.514444444},
'inch_per_hour' : {'cm_per_hour' : lambda x : x * 2.54,
'mm_per_hour' : lambda x : x * 25.4},
'inch' : {'cm' : lambda x : x * 2.54,
'mm' : lambda x : x * 25.4},
'foot' : {'meter' : lambda x : x * 0.3048},
'mmHg' : {'inHg' : lambda x : x / 25.4,
'inch' : {'cm' : lambda x : x * CM_PER_INCH,
'mm' : lambda x : x * MM_PER_INCH},
'foot' : {'meter' : lambda x : x * METER_PER_FOOT},
'mmHg' : {'inHg' : lambda x : x / MM_PER_INCH,
'mbar' : lambda x : x / 0.75006168,
'hPa' : lambda x : x / 0.75006168},
'mbar' : {'inHg' : lambda x : x / 33.86,
'mbar' : {'inHg' : lambda x : x * INHG_PER_MBAR,
'mmHg' : lambda x : x * 0.75006168,
'hPa' : lambda x : x * 1.0},
'hPa' : {'inHg' : lambda x : x / 33.86,
'hPa' : {'inHg' : lambda x : x * INHG_PER_MBAR,
'mmHg' : lambda x : x * 0.75006168,
'mbar' : lambda x : x * 1.0},
'degree_C' : {'degree_F' : lambda x : x * (9.0/5.0) + 32.0},
'degree_C' : {'degree_F' : CtoF},
'degree_C_day' : {'degree_F_day' : lambda x : x * (9.0/5.0)},
'km_per_hour' : {'mile_per_hour' : lambda x : x * 0.621371192,
'km_per_hour' : {'mile_per_hour' : kph_to_mph,
'knot' : lambda x : x * 0.539956803,
'meter_per_second' : lambda x : x * 0.277777778},
'meter_per_second' : {'mile_per_hour' : lambda x : x * 2.23693629,
'meter_per_second' : {'mile_per_hour' : mps_to_mph,
'knot' : lambda x : x * 1.94384449,
'km_per_hour' : lambda x : x * 3.6},
'meter_per_second2': {'mile_per_hour2' : lambda x : x * 2.23693629,
@@ -244,11 +267,11 @@ conversionDict = {
'mm_per_hour' : lambda x : x * 10.0},
'mm_per_hour' : {'inch_per_hour' : lambda x : x * .0393700787,
'cm_per_hour' : lambda x : x * 0.10},
'cm' : {'inch' : lambda x : x * 0.393700787,
'cm' : {'inch' : lambda x : x / CM_PER_INCH,
'mm' : lambda x : x * 10.0},
'mm' : {'inch' : lambda x : x * .0393700787,
'mm' : {'inch' : lambda x : x / MM_PER_INCH,
'cm' : lambda x : x * 0.10},
'meter' : {'foot' : lambda x : x * 3.2808399 },
'meter' : {'foot' : lambda x : x / METER_PER_FOOT},
'dublin_jd' : {'unix_epoch' : lambda x : (x-25567.5) * 86400.0},
'unix_epoch' : {'dublin_jd' : lambda x : x/86400.0 + 25567.5},
'second' : {'hour' : lambda x : x/3600.0,
@@ -706,8 +729,8 @@ class Converter(object):
Examples:
>>> p_m = (1016.5, 'mbar', 'group_pressure')
>>> c = Converter()
>>> print c.convert(p_m)
(30.020673360897813, 'inHg', 'group_pressure')
>>> print "%.3f %s %s" % c.convert(p_m)
30.017 inHg group_pressure
Try an unspecified unit type:
>>> p2 = (1016.5, None, None)
@@ -757,10 +780,12 @@ class Converter(object):
>>> c = Converter()
>>> # Source dictionary is in metric units
>>> source_dict = {'dateTime': 194758100, 'outTemp': 20.0,\
'usUnits': weewx.METRIC, 'barometer':1015.8, 'interval':15}
'usUnits': weewx.METRIC, 'barometer':1015.9166, 'interval':15}
>>> target_dict = c.convertDict(source_dict)
>>> print target_dict
{'outTemp': 68.0, 'interval': 15, 'barometer': 30.0, 'dateTime': 194758100}
>>> print "dateTime: %d, interval: %d, barometer: %.3f, outTemp: %.3f" %\
(target_dict['dateTime'], target_dict['interval'], \
target_dict['barometer'], target_dict['outTemp'])
dateTime: 194758100, interval: 15, barometer: 30.000, outTemp: 68.000
"""
target_dict = {}
for obs_type in obs_dict:
@@ -1079,7 +1104,7 @@ def convertStd(val_t, target_std_unit_system):
Example:
>>> value_t = (30.02, 'inHg', 'group_pressure')
>>> print "(%.2f, %s, %s)" % convertStd(value_t, weewx.METRIC)
(1016.48, mbar, group_pressure)
(1016.59, mbar, group_pressure)
>>> value_t = (1.2, 'inch', 'group_rain')
>>> print "(%.2f, %s, %s)" % convertStd(value_t, weewx.METRICWX)
(30.48, mm, group_rain)

View File

@@ -10,28 +10,8 @@ import math
import time
import weewx.uwxutils
INHG_PER_MBAR = 0.0295299830714
METER_PER_FOOT = 0.3048
METER_PER_MILE = 1609.34
MM_PER_INCH = 25.4
def CtoK(x):
return x + 273.15
def CtoF(x):
return x * 1.8 + 32.0
def FtoC(x):
return (x - 32.0) * 5.0 / 9.0
def mps_to_mph(x):
return x * 3600.0 / METER_PER_MILE
def kph_to_mph(x):
return x * 1000.0 / METER_PER_MILE
def degtorad(x):
return x * math.pi / 180.0
from weewx.units import INHG_PER_MBAR, METER_PER_FOOT, METER_PER_MILE, MM_PER_INCH
from weewx.units import CtoK, CtoF, FtoC, mps_to_mph, kph_to_mph
def dewpointF(T, R):
"""Calculate dew point.
@@ -299,7 +279,7 @@ def solar_rad_Bras(lat, lon, altitude_m, ts=None, nfac=2):
# NREL solar constant W/m^2
nrel = 1367.0
# radiation on horizontal surface at top of atmosphere (bras eqn 2.9)
sinel = math.sin(degtorad(el))
sinel = math.sin(math.radians(el))
io = sinel * nrel / (R * R)
if sinel >= 0:
# optical air mass (bras eqn 2.22)
@@ -366,7 +346,7 @@ def solar_rad_RS(lat, lon, altitude_m, ts=None, atc=0.8):
R = alm.sun.earth_distance
z = altitude_m
nrel = 1367.0 # NREL solar constant, W/m^2
sinal = math.sin(degtorad(el))
sinal = math.sin(math.radians(el))
if sinal >= 0: # sun must be above horizon
rm = math.pow((288.0-0.0065*z)/288.0,5.256)/(sinal+0.15*math.pow(el+3.885,-1.253))
toa = nrel * sinal / (R * R)

View File

@@ -1,5 +1,5 @@
#
# Copyright (c) 2009-2015 Tom Keffer <tkeffer@gmail.com>
# Copyright (c) 2009-2016 Tom Keffer <tkeffer@gmail.com>
#
# See the file LICENSE.txt for your full rights.
#
@@ -14,6 +14,7 @@ import weewx.engine
import weewx.wxformulas
import weeutil.weeutil
from weewx.units import CtoF, mps_to_mph, kph_to_mph
class StdWXCalculate(weewx.engine.StdService):
"""Wrapper class for WXCalculate.
@@ -347,12 +348,12 @@ class WXCalculate(object):
else:
T_max, T_min, rad_avg, wind_avg, std_unit = r
if std_unit == weewx.METRIC or std_unit == weewx.METRICWX:
T_max = weewx.wxformulas.CtoF(T_max)
T_min = weewx.wxformulas.CtoF(T_min)
T_max = CtoF(T_max)
T_min = CtoF(T_min)
if std_unit == weewx.METRICWX:
wind_avg = weewx.wxformulas.mps_to_mph(wind_avg)
wind_avg = mps_to_mph(wind_avg)
else:
wind_avg = weewx.wxformulas.kph_to_mph(wind_avg)
wind_avg = kph_to_mph(wind_avg)
data['ET'] = weewx.wxformulas.evapotranspiration_US(
T_max, T_min, rad_avg, wind_avg,
self.wind_height, self.latitude,
@@ -383,9 +384,9 @@ class WXCalculate(object):
if row[1]:
inc_hours = row[0] / 60.0
if row[2] == weewx.METRICWX:
run += weewx.wxformulas.mps_to_mph(row[1]) * inc_hours
run += mps_to_mph(row[1]) * inc_hours
elif row[2] == weewx.METRIC:
run += weewx.wxformulas.kph_to_mph(row[1]) * inc_hours
run += kph_to_mph(row[1]) * inc_hours
else:
run += row[1] * inc_hours
data['windrun'] = run

View File

@@ -34,7 +34,7 @@ Fixed anti-alias bug in genplot. Issue #111.
Corrected the conversion factor between inHg and mbar. Thanks to user Olivier.
Corrected conversion factor for inHg and mbar in ultimeter driver.
Consolidated unit conversions into module weewx.units.
Plots longer than two years now use an x-axis increment of one year. Thanks to
user Olivier!