Calcolare valori nei rapporti

Se hai bisogno di calcolare un nuovo valore, dovresti generalmente sforzarti di farlo in un'estensione dell'elenco di ricerca o XType. Tuttavia, ci sono occasioni in cui è più rapido e semplice eseguire il calcolo direttamente nel rapporto, utilizzando la direttiva Cheetah #set .

Ecco un esempio in cui calcoliamo il tempo trascorso tra l'alba e il tramonto:

#set $dawntodusk = $almanac(horizon=-6).sun(use_center=1).set.raw - $almanac(horizon=-6).sun(use_center=1).rise.raw

L'espressione calcola la semplice differenza tra due valori: l'ora del tramonto meno l'ora dell'alba, entrambi in unix epoch time. Il risultato sarà il tempo trascorso in secondi. Per i dettagli sul tag $almanac, vedere Almanacco nella guida alla personalizzazione. Per i dettagli sul suffisso .raw, vedere Opzioni di formattazione.

Possiamo utilizzare questo tag semplicemente facendo riferimento a $dawntodusk. Per esempio:

<p>Il tempo trascorso tra l'alba e il tramonto è $dawntodusk</p>

Questo si tradurrà in qualcosa di simile

Il tempo trascorso tra l'alba e il tramonto è 57315.0023124218

Non molto comprensibile.

Miglioramento della leggibilità

Per ottenere qualcosa di più leggibile, mentre i risultati rispettano tutte le impostazioni specificate dall'utente, comprese le conversioni di unità e la formattazione, è un po' più complicato. Ecco una versione più sofisticata che sfrutta le classi ValueTuple e ValueHelper per eseguire la formattazione. Sebbene questo esempio non implichi alcuna conversione di unità, in generale, queste classi possono occuparsi anche di questo.

#from weewx.units import ValueTuple, ValueHelper                                                                   ## 1
#set $dawn = $almanac(horizon=-6).sun(use_center=1).rise.raw                                                       ## 2
#set $dusk = $almanac(horizon=-6).sun(use_center=1).set.raw                                                        ## 3
#set $dawntodusk = $dusk - $dawn                                                                                   ## 4
#set $dawntodusk_vh = ValueHelper(ValueTuple($dawntodusk,'second','group_deltatime'),formatter=$station.formatter) ## 5

I numeri fanno riferimento ai commenti seguenti:

  1. Né class ValueTuple né ValueHelper, appaiono nel rapporto. Dobbiamo importarli.

  2. Impostare il valore $dawn sull'ora dell'alba. Il suffisso .raw garantisce che i risultati saranno in unix epoch time (piuttosto che una stringa).

  3. Simile, ma con il tramonto.

  4. Prendi la differenza. Poiché il tempo dell'epoca unix è in secondi, anche i risultati saranno in secondi.

  5. Costruisce un ValueHelper per contenere i risultati. Prendiamo in prestito un formattatore dal tag $station.

Il risultato, $dawntodusk_vh, è un ValueHelper. Quando viene reso come una stringa dal motore Cheetah, farà la magia necessaria per garantire una formattazione ragionevole per ciò che la ValueTuple contiene internamente. Questa volta, il rapporto

<p>Il tempo trascorso tra l'alba e il tramonto è $dawntodusk_vh.</p>

dà il seguente risultato:

Il tempo trascorso tra l'alba e il tramonto è 0 giorni, 15 ore, 55 minuti

Come qualsiasi altra istanza di ValueHelper, puoi sovrascrivere la formattazione. Ad esempio, specificando

Il tempo trascorso tra l'alba e il tramonto è
    $dawntodusk_vh.format("%(ora)d%(hour_label)e, %(minuto)d%(minute_label)i, and %(secondo)d%(second_label)i")

dà il seguente risultato:

Il tempo trascorso tra l'alba e il tramonto è 15 ore, 55 minuti, e 15 secondi
Autore: Tom Keffer