aladdin-connect
Version:
Client module for opening + closing garage doors via the Genie Aladdin Connect
68 lines (63 loc) • 1.82 kB
JavaScript
const session = require('./util/session')
const statuses = require('./util/door-status')
const tiny = require('tiny-json-http')
/**
* Open / close a garage door
* - If lock isn't specified, gets status for the first lock returned by the API
*/
module.exports = function status(action='close', params, callback) {
if (!callback && typeof params === 'function') {
callback = params
params = undefined
}
params = params || {}
let {deviceNumber=0, doorNumber=1} = params
let promise
if (!callback) {
promise = new Promise((res, rej) => {
callback = (err, result) => {
err ? rej(err) : res(result)
}
})
}
session({deviceNumber, doorNumber}, function _status(err, result) {
if (err) callback(err)
else {
// FIXME throw if multiple portals or doors were found
let {headers, body} = result
let url = 'https://genie.m2.exosite.com/onep:v1/rpc/process'
let user = process.env.ALADDIN_USER
// For whatever reason, close / open are 0 / 1, unlike their status codes of 4 / 1
let status = action === 'close' ? 0 : 1
body.calls = [
{
arguments: [
{ alias: `dps${doorNumber}.desired_status` }, status
],
id: 1,
procedure: 'write'
},
{
arguments: [
{ alias: `dps${doorNumber}.desired_status_user` }, user
],
id: 1,
procedure: 'write'
},
]
tiny.post({
url,
headers,
data: body
}, function done(err) {
if (err) callback(err)
else {
let statusCode = action === 'close' ? 5 : 2 // lol
let status = statuses(statusCode)
callback(null, {status, statusCode})
}
})
}
})
return promise
}