mirror of
https://github.com/weewx/weewx.git
synced 2026-04-19 17:16:56 -04:00
Consolidated unit conversions into module weewx.units
This commit is contained in:
@@ -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, _):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!
|
||||
|
||||
Reference in New Issue
Block a user