import math

import weewx
import weewx.units
weewx.units.obs_group_dict['outHumAbs'] = "group_concentration"
weewx.units.USUnits['group_concentration'] = 'gram_per_meter_cubed'
weewx.units.MetricUnits['group_concentration'] = 'gram_per_meter_cubed'
weewx.units.MetricWXUnits['group_concentration'] = 'gram_per_meter_cubed'
weewx.units.default_unit_format_dict['gram_per_meter_cubed'] = '%.1f'
weewx.units.default_unit_label_dict['gram_per_meter_cubed'] = ' g/m&sup3;'

from weewx.engine import StdService

class outHumAbsService(StdService):

    def __init__(self, engine, config_dict):
        super(outHumAbsService, self).__init__(engine, config_dict)

        self.bind(weewx.NEW_ARCHIVE_RECORD, self.new_archive_record)

    def new_archive_record(self, event):
        if event.record.get('outTemp') is not None and event.record.get('outHumidity') is not None:
            if event.record.get('usUnits') == weewx.US:
                tempC = (event.record.get('outTemp') - 32.0) / 1.8
                svp = 6.112 * math.exp(17.67 * tempC / (tempC + 243.5))
                vp = (event.record.get('outHumidity') * svp) / 100.0
                event.record['outHumAbs'] = vp / 4.6152 / (tempC + 273.15) * 1000
            else:
                svp = 6.112 * math.exp(17.67 * event.record.get('outTemp') / (event.record.get('outTemp') + 243.5))
                vp = (event.record.get('outHumidity') * svp) / 100.0
                event.record['outHumAbs'] = vp / 4.6152 / (event.record.get('outTemp') + 273.15) * 1000 
        else:
            event.record['outHumAbs'] = None