# Copyright (c) 2026 Meteo Ponte San Nicoḷ. Tutti i diritti riservati.
#
# Questo plugin consente di calcolare il parametro "outVPD", ossia il deficit di pressione di vapore, espresso in kPa indipendentemente dall'unità di misura della pressione usata.
#
# Requisiti:
#    1. Weewx 4.2 o successivi
#    2. Temperatura e umidità esterni rilevati
#
# Istruzioni per l'installazione:
#    1. Fermare il processo "weewxd" (a seconda del metodo di installazione)
#    2. Inserire questo file nella cartella bin/user
#    3. Nel file configurazione weewx.conf, sottosezione [Engine][[Services]], aggiungere "outVPDService" alla riga "data_services". Ad esempio:
#
#        [Engine]
#            [[Services]]
#                data_services = user.outvpd.outVPDService
#
#    4. Riavviare il processo "weewxd"

import math

import weewx
import weewx.units
weewx.units.obs_group_dict['outVPD'] = "group_pressure_vpd"
weewx.units.USUnits['group_pressure_vpd'] = 'kPa_vpd'
weewx.units.MetricUnits['group_pressure_vpd'] = 'kPa_vpd'
weewx.units.MetricWXUnits['group_pressure_vpd'] = 'kPa_vpd'
weewx.units.default_unit_format_dict['kPa_vpd'] = '%.3f'
weewx.units.default_unit_label_dict['kPa_vpd'] = ' kPa'

from weewx.engine import StdService

class outVPDService(StdService):

    def __init__(self, engine, config_dict):
        super(outVPDService, 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['outVPD'] = (svp - vp) / 10.0
            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['outVPD'] = (svp - vp) / 10.0 
        else:
            event.record['radiation'] = None