Ejemplo n.º 1
0
class SmartHome:
    def __init__(self, config):
        self.logger = logging.getLogger("SmartHome")
        self.config = config

        httpThreadsNumber = int(config['http_threads_number'])
        self.httpDispatcher = MultiThreadingDispatcher("HttpDispatcher",
                                                       httpThreadsNumber)

        self.httpHandler = HTTPCommandHandler()

        self.httpHandler.setHandler('ping', self.pingHandler)
        self.httpHandler.setHandler('status', self.statusHandler)

        self.videoController = VideoController(config['VideoController'])
        self.videoCommandHandler = VideoCommandHandler(self.videoController)
        self.httpHandler.setHandler('video',
                                    self.videoCommandHandler.handleCommand)

        self.controlManager = ControlManager(config['ControlManager'])
        self.controlCommandHandler = ControlCommandHandler(self.controlManager)
        self.httpHandler.setHandler('control',
                                    self.controlCommandHandler.handleCommand)

        self.sensorManager = SensorManager(config['SensorManager'])
        self.sensorCommandHandler = SensorCommandHandler(self.sensorManager)
        self.httpHandler.setHandler('sensor',
                                    self.sensorCommandHandler.handleCommand)

        self.http_port = int(config['http_port'])
        self.httpServer = DispatchedBackgroundHTTPServer(
            ('', self.http_port), self.httpHandler.getRequestHandlerClass(),
            self.httpDispatcher)
        self.httpServer.allow_reuse_address = True

        self.arduinoController = ArduinoController(config['ArduinoController'])

        self.shellSensorProvider = ShellSensorProvider(
            config['ShellSensorProvider'])
        self.shellControlProvider = ShellControlProvider(
            config['ShellControlProvider'])

        self.eventManager = EventManager(config['EventManager'])
        self.eventCommandHandler = EventCommandHandler(self.eventManager)

        self.shellEventHandlerProvider = ShellEventHandlerProvider(
            config['ShellEventHandlerProvider'])
        self.httpHandler.setHandler('event',
                                    self.eventCommandHandler.handleCommand)

    def start(self):
        self.logger.info("Starting")
        self.httpDispatcher.start()
        self.httpServer.startServer()

        self.videoController.start()
        self.arduinoController.start()
        self.shellSensorProvider.start()
        self.shellControlProvider.start()

        self.arduinoController.registerControls(self.controlManager.addControl)
        self.shellControlProvider.registerControls(
            self.controlManager.addControl)
        self.shellSensorProvider.registerSensors(self.sensorManager.addSensor)

        self.controlManager.start()
        self.sensorManager.start()

        self.shellEventHandlerProvider.registerEventHandlers(
            self.eventManager.addEventHandler)

        self.eventManager.start()

        self.logger.info("Started")

    def stop(self):
        self.logger.info("Stopping")
        self.httpServer.stopServer()
        self.httpDispatcher.stop()

        self.eventManager.stop()

        self.controlManager.stop()
        self.sensorManager.stop()

        self.arduinoController.stop()
        self.shellSensorProvider.stop()
        self.shellControlProvider.stop()
        self.videoController.stop()

        self.logger.info("Stopped")

    def getStatus(self):
        status = {
            'http_port': self.http_port,
            'ControlManager': self.controlManager.getStatus(),
            'SensorManager': self.sensorManager.getStatus(),
            'EventManager': self.eventManager.getStatus(),
        }
        return status

    def statusHandler(self, cmd, args):
        return self.getStatus()

    def pingHandler(self, cmd, args):
        return True