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")
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
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()
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