X-Git-Url: https://git.llucax.com/z.facultad/75.59/weathemulator.git/blobdiff_plain/c10467ea59785e566c81cc6b8f2c32b0573bf73d..27bce1f66927aa05c32a8b87d2164e8aab15b87b:/src/sensor.py?ds=sidebyside diff --git a/src/sensor.py b/src/sensor.py index e677b6b..da38687 100644 --- a/src/sensor.py +++ b/src/sensor.py @@ -51,6 +51,7 @@ class Sensor(Synchronizable, threading.Thread): return self.mu def run(self): + #TODO Alguna forma de pausarlo while 1: # Hacer algún signal al monitor de los sensores self.valorActual = self.getValor() @@ -117,10 +118,106 @@ class SensorDireccionViento(Sensor): self, self.valorActual) +class SensorCalibrado(Sensor): + + valorBruto = SyncProp("Valor en bruto leido del dispositivo.") + valorBajo = SyncProp("Valor bajo de calibrado como tupla (valorBruto, " \ + "valorCalibrado).") + valorAlto = SyncProp("Valor alto de calibrado como tupla (valorBruto, " \ + "valorCalibrado).") + + def __init__(self, valorBajo, valorAlto, sigma, periodo): + self.valorBajo = valorBajo + self.valorAlto = valorAlto + Sensor.__init__(self, sigma, periodo) + + def getValor(self): + "Simula la medición del dispositivo físico." + self.valorBruto = self.mu = Sensor.getValor(self) + (x1, y1) = self.valorBajo + (x2, y2) = self.valorAlto + return (y2 - y1) / (x2 - x1) * (self.mu - x1) + y1 + + def __repr__(self): + return "<%s valorActual=%s valorBruto=%f valorBajo=%s valorAlto=%s>" \ + % (self.__class__.__name__, self, self.valorBruto, self.valorBajo, + self.valorAlto) + + +class SensorHistorico(SensorCalibrado): + + def __init__(self, valorBajo, valorAlto, sigma, periodo): + # Listado de los valores de las últimas 24hs (inicializado con None) + self.historial = [(None, None) for i in xrange(int(24 * 60 * 60 / periodo))] + SensorCalibrado.__init__(self, valorBajo, valorAlto, sigma, periodo) + + def getValor(self): + "Simula la medición del dispositivo físico." + nuevo = SensorCalibrado.getValor(self) + hora = time.strftime("%c") + self.actualizarHistorial(nuevo, hora) + return nuevo + + def actualizarHistorial(self, valor, hora): + self.historial.pop(0) + self.historial.append((valor, hora)) + actualizarHistorial = synchronized('historialLock')(actualizarHistorial) + + def getMin(self): + minimo = (None, None) + for (valor, hora) in self.historial: + if minimo[0] is None or valor <= minimo[0]: + minimo = (valor, hora) + return minimo + getMin = synchronized('historialLock')(getMin) + + def getMax(self): + maximo = (None, None) + for (valor, hora) in self.historial: + if valor >= maximo[0]: + maximo = (valor, hora) + return maximo + getMax = synchronized('historialLock')(getMax) + + valorMinimo = property(getMin, doc="Mínimo de las últimas 24hs como " \ + "tupla (minimo, hora).") + valorMaximo = property(getMax, doc="Máximo de las últimas 24hs como " \ + "tupla (maximo, hora).") + + +class SensorHumedad(SensorHistorico): + + def __init__(self): + SensorHistorico.__init__(self, (0.0, 0.0), (100.0, 100.0), 0.3, 300.0) + + def initMu(self): + return self.rnd.gauss(70.0, 5.0) + + +class SensorVelocidadViento(SensorHistorico): + + def __init__(self): + SensorHistorico.__init__(self, (0.0, 0.0), (100.0, 100.0), 0.1, 0.5) + + def initMu(self): + return self.rnd.gauss(30.0, 8.0) + + if __name__ == '__main__': DEBUG = True sensor = SensorDireccionViento() sensor.setDaemon(True) sensor.start() + sensor2 = SensorHumedad() + sensor2.setDaemon(True) + sensor2.start() + sensor3 = SensorVelocidadViento() + sensor3.setDaemon(True) + sensor3.start() + time.sleep(2) + sensor2.valorBajo = (0.0, -10.0) + sensor2.valorAlto = (100.0, 10.0) + print sensor3.valorMinimo, sensor3.valorMaximo time.sleep(3) + print sensor3.valorMinimo, sensor3.valorMaximo