UNPKG

node-red-contrib-pjlink

Version:
308 lines (292 loc) 11.9 kB
/** * Copyright 2015 Nathanaël Lécaudé * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ 'use strict'; module.exports = function(RED) { var pjlink = require('pjlink'); function PJLink_func(config) { RED.nodes.createNode(this, config); var node = this; node.ip = config.ip; node.port = parseInt(config.port); node.projectors = {}; if (node.ip && node.port) { node.projectors[node.ip + ':' + node.port] = new pjlink(node.ip, node.port, node.credentials.password); //node.warn(`Creating projector ${node.ip} at port ${node.port}`); } refreshNodeStatus(); node.interval = setInterval(refreshNodeStatus, 60 * 1000); function handleError(msg, err, projectorID) { node.error(`${projectorID} ${err}`, msg); node.send([null, {payload: `${projectorID} ${err}`}]); if (projectorID && node.projectors[projectorID] && err && err.includes && err.includes("ECONNREFUSED")) { node.warn("connection to " + projectorID + " is being reset"); //we attempt another connexion every time the connection is refused node.projectors[projectorID].disconnect(); node.projectors[projectorID] = null; delete node.projectors[projectorID]; } } function refreshNodeStatus() { if (node.ip && node.port) { if (node.projectors[node.ip + ':' + node.port]) { node.projectors[node.ip + ':' + node.port].getPowerState(function(err, state) { if (state === 0) node.status({ fill: "red", shape: "dot", text: "off" }); if (state == 1) node.status({ fill: "green", shape: "dot", text: "on" }); if (state == 2) node.status({ fill: "blue", shape: "dot", text: "cooling down..." }); if (state == 3) node.status({ fill: "yellow", shape: "dot", text: "warming up..." }); if (err) node.status({ fill: "red", shape: "dot", text: "error" }); }); } } } node.on('input', function(msg) { var projectorID; if ((!node.port && !msg.port) || (!node.ip && !msg.host)) { if (!node.port && !msg.port) node.error("Error: No port specified.", msg); if (!node.ip && !msg.host) node.error("Error: No host specified.", msg); return; } // If projector not in list, add it if (msg.host && msg.port) { projectorID = msg.host + ':' + msg.port; if (!node.projectors[projectorID]) { if (msg.password) { node.projectors[projectorID] = new pjlink(msg.host, msg.port, msg.password); } else { node.projectors[projectorID] = new pjlink(msg.host, msg.port); } //node.warn(`Creating projector ${msg.host} at port ${msg.port}`); } } if (node.ip && node.port && (!msg.ip && !msg.port)) { //node.warn('Using ip from config'); msg.host = node.ip; msg.port = node.port; msg.password = node.credentials.password; projectorID = msg.host + ':' + msg.port; } if (msg.payload == "on") { node.projectors[projectorID].powerOn(function(err) { if (err) { handleError(msg, err, projectorID); } else { if (node.ip && node.port) { node.status({ fill: "grey", shape: "dot", text: "updating..." }); setTimeout(refreshNodeStatus, 15000); } } }); } if (msg.payload == "off") { node.projectors[projectorID].powerOff(function(err) { if (err) { handleError(msg, err, projectorID); } else { if (node.ip && node.port) { node.status({ fill: "grey", shape: "dot", text: "updating..." }); setTimeout(refreshNodeStatus, 5000); } } }); } if (msg.payload == "getname") { node.projectors[projectorID].getName(function(err, name) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = name; node.send([msg, null]); } }); } if (msg.payload == "getmanufacturer") { node.projectors[projectorID].getManufacturer(function(err, manufacturer) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = manufacturer; node.send([msg, null]); } }); } if (msg.payload == "getmodel") { node.projectors[projectorID].getModel(function(err, model) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = model; node.send([msg, null]); } }); } if (msg.payload == "getmute") { node.projectors[projectorID].getMute(function(err, mute) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = mute; node.send([msg, null]); } }); } if (msg.payload == "geterrors") { node.projectors[projectorID].getErrors(function(err, errors) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = errors; node.send([msg, null]); } }); } if (msg.payload == "getlamps") { node.projectors[projectorID].getLamps(function(err, lamps) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = lamps; node.send([msg, null]); } }); } if (msg.payload == "getinput") { node.projectors[projectorID].getInput(function(err, input) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = input; node.send([msg, null]); } }); } if (msg.payload == "getinputs") { node.projectors[projectorID].getInputs(function(err, inputs) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = inputs; node.send([msg, null]); } }); } if (msg.payload == "getinfo") { node.projectors[projectorID].getInfo(function(err, info) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = info; node.send([msg, null]); } }); } if (msg.payload == "getclass") { node.projectors[projectorID].getClass(function(err, _class) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = _class; node.send([msg, null]); } }); } if (msg.payload == "getpowerstate") { node.projectors[projectorID].getPowerState(function(err, state) { if (err) { handleError(msg, err, projectorID); } else { msg.payload = state; node.send([msg, null]); } }); } if (msg.payload == "muteon") { node.projectors[projectorID].setMute({ 'video': true, 'audio': true }, function(err) { if (err) { handleError(msg, err, projectorID); } }); } if (msg.payload == "muteoff") { node.projectors[projectorID].setMute({ 'video': false, 'audio': false }, function(err) { if (err) { handleError(msg, err, projectorID); } }); } if (typeof msg.payload == 'object') { node.projectors[projectorID].setInput(msg.payload, function(err) { if (err) { handleError(msg, err, projectorID); } }); } }); node.on('close', function() { for (let projector in node.projectors) { if (node.projectors[projector]) node.projectors[projector].disconnect(); } node.projectors = {}; node.status({}); clearInterval(node.interval); }); } RED.nodes.registerType("pjlink", PJLink_func, { credentials: { password: { type: "password" } } }); };