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
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()
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
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)
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)
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)
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)
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)
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()
def unregisterService(): log("Unregistering zeroconf service...") zeroconf.unregister_service(info)
def stopProducing(self): self.isPaused = True self.isStopped = True log('producer is requesting to be stopped')
def startGstreamerAudio(): spawnNonDaemonProcess(reactor, LoggingProtocol('gstream-audio'), '/bin/sh', ['sh', 'gstream_audio.sh']) log('Started gstreamer audio')
def _responseFailed(self, err, producer): log('connection to client lost') producer.stopProducing()
def resetAfterConfigUpdate(self): log('Updated config') self.config.write()
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()
def errLineReceived(self, line): log('MotionDetector: error: %s' % line)
def connectionMade(self): log('MJPEG Image stream received') self.data = '' self.tnow = datetime.now() self.cumDataLen = 0 self.cumCalls = 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")
def resetAfterConfigUpdate(self): log('Updated config') self.config.write() self.oximeterReader.reset() self.motionDetectorStatusReader.reset()
def errLineReceived(self, line): log('Video: error: %s' % line)
def startAudioIfAvailable(): if audioAvailable(): startAudio() else: log('Audio not detected. Starting in silent mode')