X-Git-Url: https://git.llucax.com/z.facultad/75.59/weathemulator.git/blobdiff_plain/05be29acbb29c37bf33c2dad6c54ba91b81ba9e4..eb259b5a302ea4dd1216f14fb13316661e3f97a0:/src/sensor.py diff --git a/src/sensor.py b/src/sensor.py index da38687..b824e13 100644 --- a/src/sensor.py +++ b/src/sensor.py @@ -30,6 +30,19 @@ import random import threading from sync import * + +__all__ = ('SensorDireccionViento', 'SensorHumedad', 'SensorPresion', + 'SensorTemperatura', 'SensorVelocidadViento') + + +DEBUG = False + + +def dprint(msg): + if DEBUG: + print msg + + class Sensor(Synchronizable, threading.Thread): valorActual = SyncProp("Valor actualmente medido por el sensor") @@ -53,10 +66,10 @@ class Sensor(Synchronizable, threading.Thread): def run(self): #TODO Alguna forma de pausarlo while 1: - # Hacer algún signal al monitor de los sensores - self.valorActual = self.getValor() - print self.valorActual + #TODO Hacer algún signal al monitor de los sensores time.sleep(self.periodo) + self.valorActual = self.getValor() + dprint(self) def __str__(self): return self.valorActual @@ -203,6 +216,60 @@ class SensorVelocidadViento(SensorHistorico): return self.rnd.gauss(30.0, 8.0) +class SensorTendencia(SensorHistorico): + + def __init__(self, cantidadTendencia, valorBajo, valorAlto, sigma, periodo): + """cantidadTendencia es la cantidad de valores del historial a tomar al + calcular la tendencia.""" + # Listado de los valores de las últimas 24hs (inicializado con None) + self.cantidadTendencia = cantidadTendencia + SensorHistorico.__init__(self, valorBajo, valorAlto, sigma, periodo) + + def getValoresTendencia(self): + return [ + (x, y[0]) + for (x, y) in enumerate(self.historial[-self.cantidadTendencia:]) + if y[0] is not None + ] + getValoresTendencia = synchronized('historialLock')(getValoresTendencia) + + def getTendencia(self): + def sumatoria(valores): + suma = 0 + for i in valores: + suma += i + return suma + valores = self.getValoresTendencia() + suma_xy = sumatoria([x*y for (x, y) in valores]) + suma_x = sumatoria([x for (x, y) in valores]) + suma_y = sumatoria([y for (x, y) in valores]) + suma_x2 = sumatoria([x**2 for (x, y) in valores]) + n = len(valores) + pendiente = (n * suma_xy - suma_x * suma_y) / (n * suma_x2 - suma_x**2) + return math.atan(pendiente) * 2 / math.pi + + tendencia = property(getTendencia, doc="Tendencia de las últimas 24hs " \ + "(como valor de punto flotante entre 1 y -1).") + + +class SensorTemperatura(SensorTendencia): + + def __init__(self): + SensorTendencia.__init__(self, 10, (0.0, -20.0), (100.0, 80.0), 0.2, 300) + + def initMu(self): + return self.rnd.gauss(35.0, 5.0) + + +class SensorPresion(SensorTendencia): + + def __init__(self): + SensorTendencia.__init__(self, 10, (0.0, 1000.0), (100.0, 1048.0), 1, 300) + + def initMu(self): + return self.rnd.gauss(50.0, 5.0) + + if __name__ == '__main__': DEBUG = True sensor = SensorDireccionViento() @@ -214,7 +281,12 @@ if __name__ == '__main__': sensor3 = SensorVelocidadViento() sensor3.setDaemon(True) sensor3.start() + sensor4 = SensorTemperatura() + sensor4.setDaemon(True) + sensor4.periodo = 0.1 + sensor4.start() time.sleep(2) + print sensor4.tendencia sensor2.valorBajo = (0.0, -10.0) sensor2.valorAlto = (100.0, 10.0) print sensor3.valorMinimo, sensor3.valorMaximo