From e0b50c6059df24fbfeec56be6c4ddf164c45db62 Mon Sep 17 00:00:00 2001 From: ebelcrom Date: Mon, 10 Feb 2020 00:11:25 +0100 Subject: [PATCH] wabcam lib added --- lib/gpio.js | 3 +-- lib/webcam.js | 41 +++++++++++++++++++++++++++++++++++++++++ routes/v1/events.js | 27 +++++++++++---------------- routes/v1/status.js | 28 ++++++++++++---------------- 4 files changed, 65 insertions(+), 34 deletions(-) create mode 100644 lib/webcam.js diff --git a/lib/gpio.js b/lib/gpio.js index ebb3cfd..a39204a 100644 --- a/lib/gpio.js +++ b/lib/gpio.js @@ -4,7 +4,7 @@ const log = require('./logger')(__filename.slice(__dirname.length + 1)); const RELAIS = 16; // GPIO 23 const REED = 11; // GPIO 17 const UNKNOWN = 2; -const DELAY = 10; +const DELAY = 300; var reedState; var controlCallback = null; var notificationCallback = null; @@ -38,7 +38,6 @@ function readDebounced(pin) { log.debug('state unknown'); return UNKNOWN; } else { - log.debug('state :', state); return state; } } diff --git a/lib/webcam.js b/lib/webcam.js new file mode 100644 index 0000000..2ace8fa --- /dev/null +++ b/lib/webcam.js @@ -0,0 +1,41 @@ +const log = require('./logger')(__filename.slice(__dirname.length + 1)); +const http = require('http'); + +const username = 'view'; +const options = { + host: '192.168.3.2', + path: '/snapshot.cgi', + mthod: 'GET', + headers: { + 'Authorization': 'Basic ' + new Buffer(username + ':').toString('base64') + } +}; + +function getImage() { + return new Promise((resolve, reject) => { + const req = http.request(options, (res) => { + var image = []; + + res.on('data', (chunk) => { + image.push(chunk); + }); + + res.on('end', () => { + var buffer = Buffer.concat(image); + log.debug('Image size:', buffer.length); + resolve(buffer); + }); + }); + + req.on('error', (err) => { + log.error('Webcam error', JSON.stringify(err)); + reject('Webcam error'); + }); + + req.end(); + }); +} + +module.exports = { + getImage +} diff --git a/routes/v1/events.js b/routes/v1/events.js index cfcd85d..3b34896 100644 --- a/routes/v1/events.js +++ b/routes/v1/events.js @@ -4,7 +4,6 @@ const qStr = require('query-string'); const router = express.Router(); const db = require('./../../lib/db'); const EventEmitter = require('events'); -const fs = require('fs'); const events = new EventEmitter(); var response = null; @@ -86,22 +85,18 @@ events.on('stateChanged', (state) => { 'state': state }; if (image) { - var file = null; - switch (state) { - case 'open': - file = fs.readFileSync(__dirname + '/../../public/images/open.jpg', 'base64'); - break; - case 'closed': - file = fs.readFileSync(__dirname + '/../../public/images/closed.jpg', 'base64'); - break; - default: - log.error('Unexpected status from state'); - response.status(500).send(); - return; - } - content['image'] = file; + webcam.getImage() + .then(image => { + content['image'] = new Buffer(image).toString('base64'); + res.json(content); + }) + .catch(err => { + log.error('Error on getting webcam image', JSON.stringify(err)); + res.status(500).send(); + }); + } else { + res.json(content); } - response.json(content); response = null; } }); diff --git a/routes/v1/status.js b/routes/v1/status.js index d132241..2e79839 100644 --- a/routes/v1/status.js +++ b/routes/v1/status.js @@ -3,8 +3,8 @@ const log = require('./../../lib/logger')(__filename.slice(__dirname.length + 1) const qStr = require('query-string'); const router = express.Router(); const db = require('./../../lib/db'); -const fs = require('fs'); const gpio = require('./../../lib/gpio'); +const webcam = require('./../../lib/webcam'); /* Disables caching in client */ function nocache(req, res, next) { @@ -61,22 +61,18 @@ router.get('/', nocache, function(req, res, next) { 'state': state }; if (image) { - var file = null; - switch (state) { - case 'open': - file = fs.readFileSync(__dirname + '/../../public/images/open.jpg', 'base64'); - break; - case 'closed': - file = fs.readFileSync(__dirname + '/../../public/images/closed.jpg', 'base64'); - break; - default: - log.error('Unexpected status from settings'); - res.status(500).send(); - return; - } - content['image'] = file; + webcam.getImage() + .then(image => { + content['image'] = new Buffer(image).toString('base64'); + res.json(content); + }) + .catch(err => { + log.error('Error on getting webcam image', JSON.stringify(err)); + res.status(500).send(); + }); + } else { + res.json(content); } - res.json(content); } }); }); -- 2.30.2