コード例 #1
0
    def render_GET(self, request):
        log('getting new client of image stream')
        request.setHeader("content-type",
                          'multipart/x-mixed-replace; boundary=--spionisto')

        self.setupProducer(request)
        return server.NOT_DONE_YET
コード例 #2
0
 def connectToSerialPort(self):
     devices = glob.glob('/dev/ttyUSB*')
     if len(devices) > 0:
         log('Started reading oximeter at %s' % devices[0])
         self.oximeterReader.reset(OximeterStatus.CABLE_DISCONNECTED, 'got connection')
         self.serialPort = SerialPort(self.oximeterReader, devices[0], self.reactor, timeout=3)
         self.loop.stop()
コード例 #3
0
    def reset(self, status, asker=''):
        log('resetting with %s (by [%s])' % (status, asker))

        if not status == OximeterStatus.CONNECTED:
            self.SPO2 = -1
            self.BPM = -1
            self.alarm = 0
            self.readTime = datetime.min

        if status == OximeterStatus.CABLE_DISCONNECTED:
            self.badReadCount = 0

        self.motionDetected = False
        self.motionSustained = False
        self.status = status

        self.setLineMode()

        self.alarmStateMachine = MotionStateMachine()
        self.alarmStateMachine.CALM_TIME = 0
        self.alarmStateMachine.SUSTAINED_TIME = self.config.spo2AlarmTime

        self.motionStateMachine = MotionStateMachine()
        self.motionStateMachine.CALM_TIME = self.config.sustainedTime
        self.motionStateMachine.SUSTAINED_TIME = self.config.calmTime
コード例 #4
0
    def outLineReceived(self, line):
        if line.startswith('MOTION_DETECTOR_READY'):
            self.app.startGstreamerVideo()

        if self.PAT_STATUS.match(line):
            (self.motionDetected,
             self.motionSustained) = [int(word) for word in line.split()]
        else:
            log('MotionDetector: %s' % line)
コード例 #5
0
def startAudio():
    spawnNonDaemonProcess(reactor, LoggingProtocol('janus'),
                          '/opt/janus/bin/janus',
                          ['janus', '-F', '/opt/janus/etc/janus/'])
    log('Started Janus')

    def startGstreamerAudio():
        spawnNonDaemonProcess(reactor, LoggingProtocol('gstream-audio'),
                              '/bin/sh', ['sh', 'gstream_audio.sh'])
        log('Started gstreamer audio')

    reactor.callLater(2, startGstreamerAudio)
コード例 #6
0
    def registerService(self, ip):
        info = ServiceInfo("_http._tcp.local.",
                           "Raspberry Pi Sleep Monitor._http._tcp.local.",
                           socket.inet_aton(ip), self.portNumber, 0, 0,
                           {}, "sleepmonitor.local.")

        zeroconf = Zeroconf()
        log("Registering zeroconf service...")
        zeroconf.register_service(info)

        def unregisterService():
            log("Unregistering zeroconf service...")
            zeroconf.unregister_service(info)

        reactor.addSystemEventTrigger('before', 'shutdown', unregisterService)
コード例 #7
0
    def render_GET(self, request):
        log('Got request to change parameters to %s' % request.args)

        for paramName in self.app.config.paramNames:
            # a bit of defensive coding. We really should not be getting
            # some random data here.
            if paramName in request.args:
                paramVal = int(request.args[paramName][0])
                log('setting %s to %d' % (paramName, paramVal))
                setattr(self.app.config, paramName, paramVal)

        self.app.resetAfterConfigUpdate()

        request.setHeader("content-type", 'application/json')
        status = {'status': 'done'}
        return json.dumps(status)
コード例 #8
0
    def startGstreamerVideo(self):

        videosrc = '/dev/video0'

        try:
            out = subprocess.check_output(['v4l2-ctl', '--list-devices'])
        except subprocess.CalledProcessError as e:
            out = e.output

        lines = out.splitlines()
        for (idx, line) in enumerate(lines):
            if 'bcm2835' in line:
                nextline = lines[idx + 1]
                videosrc = nextline.strip()

        spawnNonDaemonProcess(reactor, LoggingProtocol('gstream-video'),
                              '/bin/sh', ['sh', 'gstream_video.sh', videosrc])

        log('Started gstreamer video using device %s' % videosrc)
コード例 #9
0
    def __init__(self):
        queues = []

        self.config = Config()
        self.reactor = reactor

        self.video = Video(self)
        spawnNonDaemonProcess(reactor, self.video, 'python',
                              ['python', 'VideoServer.py'])
        log('Started Video process')

        logger = Logger(self)
        logger.run()
        log('Started logging')

        factory = protocol.Factory()
        factory.protocol = JpegStreamReader
        factory.queues = queues
        factory.latestImage = None
        reactor.listenTCP(9999, factory)
        log('Started listening for MJPEG stream')

        root = File('web')
        root.putChild('stream.mjpeg', MJpegResource(queues))
        root.putChild('latest.jpeg', LatestImageResource(factory))
        root.putChild('ping', PingResource())

        site = server.Site(root)
        PORT = 80
        BACKUP_PORT = 8080

        portUsed = PORT
        try:
            reactor.listenTCP(PORT, site)
            log('Started webserver at port %d' % PORT)
        except twisted.internet.error.CannotListenError:
            portUsed = BACKUP_PORT
            reactor.listenTCP(BACKUP_PORT, site)
            log('Started webserver at port %d' % BACKUP_PORT)

        startZeroConfServer(portUsed)

        reactor.run()
コード例 #10
0
 def unregisterService():
     log("Unregistering zeroconf service...")
     zeroconf.unregister_service(info)
コード例 #11
0
 def stopProducing(self):
     self.isPaused = True
     self.isStopped = True
     log('producer is requesting to be stopped')
コード例 #12
0
 def startGstreamerAudio():
     spawnNonDaemonProcess(reactor, LoggingProtocol('gstream-audio'),
                           '/bin/sh', ['sh', 'gstream_audio.sh'])
     log('Started gstreamer audio')
コード例 #13
0
 def _responseFailed(self, err, producer):
     log('connection to client lost')
     producer.stopProducing()
コード例 #14
0
 def resetAfterConfigUpdate(self):
     log('Updated config')
     self.config.write()
コード例 #15
0
    def __init__(self):
        queues = []

        self.config = Config()
        self.reactor = reactor

        self.oximeterReader = OximeterReader(self)

        self.motionDetectorStatusReader = MotionDetectionStatusReaderProtocol(
            self)
        spawnNonDaemonProcess(reactor, self.motionDetectorStatusReader,
                              'python', ['python', 'MotionDetectionServer.py'])
        log('Started motion detection process')

        self.influxLogger = InfluxLoggerClient()
        spawnNonDaemonProcess(reactor, self.influxLogger, 'python',
                              ['python', 'InfluxDbLogger.py'])
        log('Started influxdb logging process')

        logger = Logger(self)
        logger.run()
        log('Started logging')

        factory = protocol.Factory()
        factory.protocol = JpegStreamReader
        factory.queues = queues
        factory.latestImage = None
        reactor.listenTCP(9999, factory)
        log('Started listening for MJPEG stream')

        root = File('web')
        root.putChild('stream.mjpeg', MJpegResource(queues))
        root.putChild('latest.jpeg', LatestImageResource(factory))
        root.putChild('status', StatusResource(self))
        root.putChild('ping', PingResource())
        root.putChild('getConfig', GetConfigResource(self))
        root.putChild('updateConfig', UpdateConfigResource(self))

        site = server.Site(root)
        PORT = 80
        BACKUP_PORT = 8080

        portUsed = PORT
        try:
            reactor.listenTCP(PORT, site)
            log('Started webserver at port %d' % PORT)
        except twisted.internet.error.CannotListenError:
            portUsed = BACKUP_PORT
            reactor.listenTCP(BACKUP_PORT, site)
            log('Started webserver at port %d' % BACKUP_PORT)

        startZeroConfServer(portUsed)

        startAudioIfAvailable()

        reactor.run()
コード例 #16
0
 def errLineReceived(self, line):
     log('MotionDetector: error: %s' % line)
コード例 #17
0
 def connectionMade(self):
     log('MJPEG Image stream received')
     self.data = ''
     self.tnow = datetime.now()
     self.cumDataLen = 0
     self.cumCalls = 0
コード例 #18
0
        site = server.Site(root)
        PORT = 80
        BACKUP_PORT = 8080

        portUsed = PORT
        try:
            reactor.listenTCP(PORT, site)
            log('Started webserver at port %d' % PORT)
        except twisted.internet.error.CannotListenError:
            portUsed = BACKUP_PORT
            reactor.listenTCP(BACKUP_PORT, site)
            log('Started webserver at port %d' % BACKUP_PORT)

        startZeroConfServer(portUsed)

        reactor.run()

    def resetAfterConfigUpdate(self):
        log('Updated config')
        self.config.write()


if __name__ == "__main__":
    import logging
    setupLogging()
    log('Starting main method of sleep monitor')
    try:
        app = OpenDoorBell()
    except:
        logging.exception("main() threw exception")
コード例 #19
0
 def resetAfterConfigUpdate(self):
     log('Updated config')
     self.config.write()
     self.oximeterReader.reset()
     self.motionDetectorStatusReader.reset()
コード例 #20
0
 def errLineReceived(self, line):
     log('Video: error: %s' % line)
コード例 #21
0
def startAudioIfAvailable():
    if audioAvailable():
        startAudio()
    else:
        log('Audio not detected. Starting in silent mode')