prisme-flow
Version:
prisme platform flow engine
194 lines (160 loc) • 5.01 kB
JavaScript
/**
* Created by prisme.io on 09/06/2017.
*/
/**
* Modbus Read node.
* @module NodeRedModbusRead
*
* @param RED
*/
module.exports = function (RED) {
'use strict'
let internalDebugLog = require('debug')('node_red_contrib_modbus')
function ModbusQueueInfo (config) {
RED.nodes.createNode(this, config)
this.name = config.name
this.unitid = parseInt(config.unitid)
this.lowLowLevel = parseInt(config.lowLowLevel)
this.lowLevel = parseInt(config.lowLevel)
this.highLevel = parseInt(config.highLevel)
this.highHighLevel = parseInt(config.highHighLevel)
this.errorOnHighLevel = config.errorOnHighLevel
let node = this
let modbusClient = RED.nodes.getNode(config.server)
node.queueReadInterval = null
if (RED.settings.verbose) {
internalDebugLog.enabled = true
}
setNodeStatusTo('waiting')
node.resetStates = function () {
node.lowLowLevelReached = true
node.lowLevelReached = false
node.highLevelReached = false
node.highHighLevelReached = false
}
node.resetStates()
node.readFromQueue = function () {
let unit = node.unitid || 1
if (modbusClient.bufferCommands) {
if (unit < 0 || unit > 255) {
unit = 1
}
let items = modbusClient.bufferCommandList.get(unit).length
if (!items || (!node.lowLowLevelReached && items < node.lowLowLevel)) {
node.resetStates()
}
if (!node.lowLevelReached && items > node.lowLowLevel && items < node.lowLevel) {
node.lowLevelReached = true
internalDebugLog({
payload: Date.now(),
state: 'low level reached',
unitid: unit,
items: items
})
}
if (!node.highLevelReached && items > node.lowLevel && items > node.highLevel) {
node.highLevelReached = true
if (node.errorOnHighLevel) {
node.error('Queue High Level Reached', {
payload: Date.now(),
state: 'high level reached',
unitid: unit,
highLevel: node.highLevel,
items: items
})
} else {
node.warn({
payload: Date.now(),
state: 'high level reached',
unitid: unit,
highLevel: node.highLevel,
items: items
})
}
}
if (!node.highHighLevelReached && items > node.highLevel && items > node.highHighLevel) {
node.highHighLevelReached = true
node.error('Queue High High Level Reached', {
payload: Date.now(),
state: 'high high level reached',
unitid: unit,
highLevel: node.highLevel,
highHighLevel: node.highHighLevel,
items: items
})
}
let fillColor = 'blue'
if (node.lowLevelReached) {
fillColor = 'green'
}
if (node.highLevelReached) {
if (node.errorOnHighLevel) {
fillColor = 'red'
} else {
fillColor = 'yellow'
}
}
if (node.highHighLevelReached) {
fillColor = 'red'
}
node.status({
fill: fillColor,
shape: 'ring',
text: 'active unit ' + unit + ' queue items: ' + items
})
} else {
setNodeStatusTo('active unit ' + unit + ' without queue')
}
}
node.onModbusInit = function () {
node.readFromQueue()
}
node.onModbusActive = function () {
node.readFromQueue()
}
node.onModbusQueue = function () {
node.readFromQueue()
}
modbusClient.on('mbinit', node.onModbusInit)
modbusClient.on('mbqueue', node.onModbusQueue)
modbusClient.on('mbactive', node.onModbusActive)
node.queueReadInterval = setInterval(node.readFromQueue, 1000)
node.on('input', function (msg) {
msg.queueEnabled = modbusClient.bufferCommands
if (Number.isInteger(node.unitid)) {
msg.queue = modbusClient.bufferCommandList.get(node.unitid)
msg.unitid = node.unitid
} else {
msg.queues = modbusClient.bufferCommandList
}
if (msg &&
msg.resetQueue &&
modbusClient.bufferCommands) {
modbusClient.initQueue()
modbusClient.warn('Init Queue By External Node')
node.resetStates()
node.status({
fill: 'blue',
shape: 'ring',
text: 'active empty unit queue'
})
}
node.send(msg)
})
node.on('close', function () {
setNodeStatusTo('closed')
if (node.queueReadInterval) {
clearInterval(node.queueReadInterval)
}
node.queueReadInterval = null
})
function setNodeStatusTo (statusValue) {
node.status({
fill: 'green',
shape: 'ring',
text: statusValue
})
}
}
RED.nodes.registerType('modbus-queue-info', ModbusQueueInfo)
}