node-red-contrib-axis-host
Version:
Axis Devices resource binding nodes that provides access to events, image capture and analytics data. Node-RED must be running on the Axis Device.
100 lines (90 loc) • 2.57 kB
JavaScript
//Copyright (c) 2023 Fred Juhlin
const { spawn } = require('child_process');
module.exports = function(RED) {
function Axis_Trigger(config) {
RED.nodes.createNode(this,config);
this.eventID = config.eventId;
this.value = config.value;
this.triggerProcess = 0;
var node = this;
node.on('input', function(msg) {
var eventId = node.eventID;
var value = node.value || msg.payload;
var args = [];
switch( eventId ) {
case "event":
if( typeof value === "string" )
value = parseInt(value);
if( isNaN(value) ) {
msg.payload = "Value must be a number";
node.error("Invlid input",msg);
return;
}
args.push('-t');
args.push('0');
args.push('-v');
args.push(value);
break;
case "state":
if( value === "true" )
value = 1;
if( value === "false" )
value = 0;
if( typeof value === "string" )
value = parseInt(value);
if( value === true )
value = 1;
if( value === false )
value = 0;
if( isNaN(value) ) {
msg.payload = "Value must be a boolean";
node.error("Invlid input",msg);
return;
}
args.push('-t');
args.push('1');
args.push('-s');
args.push(value);
break;
case "data":
if( typeof value === "number" )
value = value.toString();
if( typeof value === "object" )
value = JSON.stringify(value);
if( typeof value !== "string" ) {
msg.payload = "Value must be a string";
node.error("Invlid input",msg);
return;
}
args.push('-t');
args.push('2');
args.push('-d');
args.push('\'' + value + '\'');
break;
default:
node.error("Trigger failed",{payload: eventId + " is not a valid event type"});
return;
}
node.triggerProcess = spawn("/usr/local/packages/Nodered/opt/eventcli",args);
node.triggerProcess.on('error', (error) => {
node.error("Event Error",{payload:"Unable to locate service"});
});
node.triggerProcess.stderr.on('data', (data) => {
node.error("Event error",{topic:"Error",payload:data.toString()} );
});
node.on('close', (done) => {
if (node.triggerProcess) {
node.triggerProcess.kill(); // Terminate the child process
}
node.triggerProcess = 0;
done();
});
});
}
RED.nodes.registerType("Trigger",Axis_Trigger,{
defaults: {
eventId: { type:"text" },
value: { type: "text" }
}
});
}