Kalibrointi moduli

Aloittaja angle, keskiviikko, 13.06.2012, 18:43

« edellinen - seuraava »

0 Jäsenet ja 3 Vieraat katselee tätä aihetta.

angle

Tuli tässä fiilattua käyttöön tämä PyWWS:n kalibrointi moduli. Aikaisemmin olen laittanut korjaukset suoraan muutamaan template:en, mutta nehän ei sitten näy muissa. Tämä kalibrointi moduli huomioidaan joka paikassa ja on muutenkin varsin monikäyttöinen. Tässä siis mallia ja ohjeen tynkää käytöstä.

malli
from datetime import datetime

class Calib(object):
   def __init__(self, params):
       # Pressure offset
       self.pressure_offset = eval(params.get('fixed', 'pressure offset'))
       # pressure sensor went wrong on 19th August 2011
       self.pressure_fault = datetime(2011, 8, 19, 11, 0, 0)
   def calib(self, raw):
       result = dict(raw)
       # sanitise data
       if result['wind_dir'] is not None and result['wind_dir'] >= 16:
           result['wind_dir'] = None
       # pressure readings are nonsense since sensor failed
       if raw['idx'] < self.pressure_fault:
           result['rel_pressure'] = raw['abs_pressure'] + self.pressure_offset
       else:
           result['abs_pressure'] = None
           result['rel_pressure'] = None
       # correct sun effect
       if raw['temp_out'] is not None and raw['temp_out'] >= 15:
           result['temp_out'] = raw['temp_out'] - (raw['temp_out'] * 0.2 - 3)
       else:
           result['temp_out'] = raw['temp_out']
       # correct rain
       result['rain'] = raw['rain'] * 1.1
       return result


Koodia korjattu, lämpötilan ehtolausekkeen  jälkimmäinen result[temp_out] muutettu raw[temp_out].

Tuohon alkuun siis pitää laittaa nuo oletus kalibroinnit tuulesta ja paineesta, kuten ohjeessa lukee. Ne on normaalisti sisäänrakennettu, mutta kun käyttäjän kalibrointi otetaan käyttöön niin pitää laittaa tänne.

Ensin siinä on tuulen suunta arvojen suodatus nolla nopeudelle.

Sitten siinä on kehittäjän muunnelma malli kuinka ilmanpaineen mittaus on plokattu tietyn päivämäärän jälkeen. Eli kun päiväys on ennen annettua niin käytetään ilmanpainearvo  offset:lla höystettynä. Offset haetaan siis weather.ini filusta.

Sitten siinä on minun malli lämpötilan korjauksesta. Kun lämpötila arvo ei puutu ja on yli 15 astetta niin käytetään kaavaa. Muissa tapauksissa lämpötila-arvoa ei muuteta.

Sitten vielä minun malli sademittauksen kalibroinnista, eli mitattu arvo kerrotaan 1,1.

Käyttöönotto
Tallennetaan kalibrointi tiedosto sinne module kansioon jollain nimella,esim calibrointi.py.
Weather.ini tiedostoon polku osastoon lisätään polku tuohon kalibrointi tiedostoon, mutta ilman tiedoston tarkennin osaa.
Varmistetaan ettei livelog, eikä hourly.py ole päällä eikä menekkään päälle.
Ajetaan reprocess, joka ottaa kalibroidut arvot käyttöön koko mittaushistorian ajalla.
Jos reprocess menee läpi on homma valmis ja PyWWS voidaan ottaa normaaliin käyttöön kalibroiduilla arvoilla.

Vielä yhtenä esimerkkinä voisi olla se että jos on käytössä UV ja/tai aurinko sensori niin niiden arvoja voisi käyttää ehtona milloin lämpötila-arvoa aletaan korjata alaspäin.

Tuo malli on siis vaan malli, joka varmaan toimiikiin, mutta tarkoitus on vaan antaa ideoita kuinka sitä käytetään.

oldpet

Ajattelin kokeilla tätä. Pitäisi korjata offset kun mittari sijaitsee n. 65 metriä merenpinnasta. Onko tuohon kalibrointi-fileen tullut hyväksi havaittuja muutoksia tuon jälkeen?

Samaten, lämpötilassa näkyy heti auringon vaikutus kun se paistaa tuosta kerrostalojen välistä, lämpötila näyttää pari astetta liian korkeaa. UV-sensoria mulla ei ole joten tuohon ei varmaan pysty tekemään kunnollista korjausta. Kellon mukaan säätyvä ei varmaan oikein toimi kun välillä on pilvistä yms.

Yksi vaihtoehto tietysti sijoittaa mittari kerrostalon toisella puolella olevalle parvekkeelle, johon ei aurinko paista. Pelkään vaan että joku sen sieltä pöllii, kun parvekkeelle on vapaa pääsy.

angle

En minä ainakaan ole mitään uutta keksinyt tähän. Koitin vilkaista millaisia lämpöpiikkejä siellä näkyy, mutta sulla näyttää graafien alarajat olevan -10 asteessa. Templateen manuaali skaalausta tai auto skaalaus käyttöön. :)

Ihan ajatuksena aikaan perustava alaspäin siirto toimisi siis myös pilvisellä säällä.

Toteutushan menisi varmaan jotenkin niin että kun aika on suurempi kuin "X" ja pienimpi kuin "Y" niin raw miinus "Z" arvo on yhtäkuin kalibroitu arvo. Noin jotenkin ajatuksena.

oldpet

Nonii, nyt on skaalattu. Pahaltahan tuo piikki näyttää


angle

#4
Vähän joutessani funtsailin tätä ja tämmöisen modulin muokkailin tuosta Jim:n mallista. Ehdotus syntyi ajatuksella, että tuo ongelmallinen ajankohta jätetään mittaamatta. Tätä en ole siis testannut, mutta pohjaksi kehittelylle. :)

from datetime import datetime

class Calib(object):
   def __init__(self, params):
       # Pressure offset
       self.pressure_offset = eval(params.get('fixed', 'pressure offset'))
       # temp sensor sun effect time zone 13:00-15:00
       self.temp_start_fault = datetime(2013, 1, 1, 13, 0, 0)
       self.temp_stop_fault = datetime(2013, 1, 1, 15, 0, 0)
   def calib(self, raw):
       result = dict(raw)
       # sanitise data
       if result['wind_dir'] is not None and result['wind_dir'] >= 16:
           result['wind_dir'] = None
       # pressure readings are nonsense since sensor failed
       if raw['idx'] < self.pressure_fault:
           result['rel_pressure'] = raw['abs_pressure'] + self.pressure_offset
       else:
           result['abs_pressure'] = None
           result['rel_pressure'] = None
       # correct sun effect
       if raw['idx'] > self.temp_start_fault and raw['idx'] < self.temp_stop_fault:
           result['temp_out'] = none
       else:
           result['temp_out'] = raw['temp_out']
       # correct rain
       result['rain'] = raw['rain'] * 1.1
       return result

Edit. Yksi if poistettu ehtolauseesta.
Edit 2. Lisätty päivämäärät
Edit 3. Ääh, eihän nuo päivämäärät noin tee sitä mitä halutaan. No olkoon.

Tuossa on mukana myös sadekipon korjauskerroin 1.1

oldpet

Kokeilin tuota mutta siinä näyttää olevan vielä jotakin häikkää
Lainaa
    Calib.calibrator = usercalib.Calib(params)
  File "/home/kristian/weath/pywws-12.10_r547/pywws/calib.py", line 120, in __init__
    Calib.calibrator = usercalib.Calib(params)
  File "/home/kristian/weath/pywws-12.10_r547/pywws/calib.py", line 114, in __init__
    self.logger.info('Using user calibration')
  File "/usr/lib/python2.7/logging/__init__.py", line 1140, in info
    self._log(INFO, msg, args, **kwargs)
  File "/usr/lib/python2.7/logging/__init__.py", line 1257, in _log
    record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info, func, extra)
  File "/usr/lib/python2.7/logging/__init__.py", line 1231, in makeRecord
    rv = LogRecord(name, level, fn, lno, msg, args, exc_info, func)
  File "/usr/lib/python2.7/logging/__init__.py", line 266, in __init__
    self.levelname = getLevelName(level)
  File "/usr/lib/python2.7/logging/__init__.py", line 167, in getLevelName
    return _levelNames.get(level, ("Level %s" % level))
RuntimeError: maximum recursion depth exceeded while getting the str of an object

Jimin calibrointitiedosto näyttää toimivan mutta sehän ei tuohon ongelmaan auta. Lueskelin eilen illalla tuosta säteilysuojan rakentelusta ja voisi ehkä kokeilla korjata pienellä laitetuulettimella ongelmaa. Semmonen löytyy jo mutta pieni aurinkopaneeli pitää käydä hakemassa Partcosta tms. Tietysti kun siirrän aseman Lapinniittyyn niin on taas uudenlaiset ongelmat edessä.

angle

Pikkasen korjasin tuota koodia. Saattoi olla yksi "if" liikaa ehtolauseessa. Tai sitten ei vaikutusta saatikka haluttua toimintoa. :)

oldpet

Moro, tuo kosahti jossain kohtaa. Muokkasin tuota Jimin pohjaa vähän tuohon tyyliin ja nyt näyttää toimivan tämmösellä

Lainaa
from datetime import datetime, time

class Calib(object):
    def __init__(self, params):
        self.pressure_offset = eval(params.get('fixed', 'pressure offset'))
        # temp sensor sun effect time zone 13:00-15:00
        self.temp_start_fault = time(13, 0, 0)
        self.temp_stop_fault = time(15, 0, 0)
    def calib(self, raw):
        result = dict(raw)
        # sanitise data
        if result['wind_dir'] is not None and result['wind_dir'] >= 16:
            result['wind_dir'] = None
        if (raw['idx'].strftime("%H, %M")  > self.temp_start_fault.strftime("%H, %M") and raw['idx'].strftime("%H, %M")  < self.temp_stop_fault.strftime("%H, %M")):
            result['temp_out'] = None
        else:
            result['temp_out'] = raw['temp_out']
        # calculate relative pressure
        result['rel_pressure'] = raw['abs_pressure'] + self.pressure_offset
        return result

Katotaan vielä lähteekö käppyrät päivittymään nettisivulle oikein. Tuota pitää varmaan vähän jatkojalostaa kunhan keksii sopivan kaavan tuolle säteilylle.

oldpet

Näyttää pythoni elävän jossain GMT-ajassa kun tuo fault-aika asettuu 15-17. No, tänään kun on pilvistä niin tuota piikkiä klo 14 ei juurikaan näy. Ei taida onnistua lämpötilakorjaus ilman UV-sensoria.

angle

Lainaus käyttäjältä: oldpet - lauantai, 19.01.2013, 23:34
Moro, tuo kosahti jossain kohtaa. Muokkasin tuota Jimin pohjaa vähän tuohon tyyliin ja nyt näyttää toimivan tämmösellä

Lainaa
from datetime import datetime, time

class Calib(object):
    def __init__(self, params):
        self.pressure_offset = eval(params.get('fixed', 'pressure offset'))
        # temp sensor sun effect time zone 13:00-15:00
        self.temp_start_fault = time(13, 0, 0)
        self.temp_stop_fault = time(15, 0, 0)
    def calib(self, raw):
        result = dict(raw)
        # sanitise data
        if result['wind_dir'] is not None and result['wind_dir'] >= 16:
            result['wind_dir'] = None
        if (raw['idx'].strftime("%H, %M")  > self.temp_start_fault.strftime("%H, %M") and raw['idx'].strftime("%H, %M")  < self.temp_stop_fault.strftime("%H, %M")):
            result['temp_out'] = None
        else:
            result['temp_out'] = raw['temp_out']
        # calculate relative pressure
        result['rel_pressure'] = raw['abs_pressure'] + self.pressure_offset
        return result

Katotaan vielä lähteekö käppyrät päivittymään nettisivulle oikein. Tuota pitää varmaan vähän jatkojalostaa kunhan keksii sopivan kaavan tuolle säteilylle.

Hienoa. Taisi tuossa mun mallissa häiritä tuo puuttuva päivämäärä jota verrattiin raw['idx'] arvoon. Pistinpä nekin vielä tuohon malliini, vaikka ei enää tarviskaan.