Olá, vou demonstrar uma forma para enviar e receber dados MQTT com o ScadaBR pelo Node-Red.
Data source virtual apenas para simulação de valores
Publisher envia dados do data source virtual para o Node-RED
Não incluir timestamp
Node-RED configurado para receber e reenviar dados
Data source receptor HTTP para receber valores
Resultado Final
Com essa implementação fica demonstrada uma simples maneira de enviar dados do ScadaBR por MQTT como tambem receber.
Json ScadaBR
{
"graphicalViews":[
],
"dataSources":[
{
"xid":"DS_992547",
"type":"VIRTUAL",
"updatePeriodType":"SECONDS",
"enabled":true,
"name":"ENVIAR NODERED\/MQTT",
"updatePeriods":10
},
{
"xid":"DS_161663",
"type":"HTTP_RECEIVER",
"deviceIdWhiteList":[
"*"
],
"enabled":true,
"ipWhiteList":[
"*.*.*.*"
],
"name":"RECEBER NODERED\/MQTT"
}
],
"dataPoints":[
{
"xid":"DP_114918",
"loggingType":"ON_CHANGE",
"intervalLoggingPeriodType":"MINUTES",
"intervalLoggingType":"INSTANT",
"purgeType":"YEARS",
"pointLocator":{
"dataType":"BINARY",
"changeType":{
"type":"NO_CHANGE",
"startValue":"0"
},
"settable":true
},
"eventDetectors":[
],
"engineeringUnits":"",
"chartColour":null,
"chartRenderer":null,
"dataSourceXid":"DS_992547",
"defaultCacheSize":1,
"deviceName":"ENVIAR NODERED\/MQTT",
"discardExtremeValues":false,
"discardHighLimit":1.7976931348623157E308,
"discardLowLimit":-1.7976931348623157E308,
"enabled":true,
"intervalLoggingPeriod":15,
"name":"BIN",
"purgePeriod":1,
"textRenderer":{
"type":"PLAIN",
"suffix":""
},
"tolerance":0.0
},
{
"xid":"DP_052981",
"loggingType":"ON_CHANGE",
"intervalLoggingPeriodType":"MINUTES",
"intervalLoggingType":"INSTANT",
"purgeType":"YEARS",
"pointLocator":{
"dataType":"NUMERIC",
"changeType":{
"type":"NO_CHANGE",
"startValue":"0"
},
"settable":true
},
"eventDetectors":[
],
"engineeringUnits":"",
"chartColour":null,
"chartRenderer":null,
"dataSourceXid":"DS_992547",
"defaultCacheSize":1,
"deviceName":"ENVIAR NODERED\/MQTT",
"discardExtremeValues":false,
"discardHighLimit":1.7976931348623157E308,
"discardLowLimit":-1.7976931348623157E308,
"enabled":true,
"intervalLoggingPeriod":15,
"name":"INT",
"purgePeriod":1,
"textRenderer":{
"type":"PLAIN",
"suffix":""
},
"tolerance":0.0
},
{
"xid":"DP_600541",
"loggingType":"ON_CHANGE",
"intervalLoggingPeriodType":"MINUTES",
"intervalLoggingType":"INSTANT",
"purgeType":"YEARS",
"pointLocator":{
"dataType":"NUMERIC",
"changeType":{
"type":"NO_CHANGE",
"startValue":"0"
},
"settable":true
},
"eventDetectors":[
],
"engineeringUnits":"",
"chartColour":null,
"chartRenderer":null,
"dataSourceXid":"DS_992547",
"defaultCacheSize":1,
"deviceName":"ENVIAR NODERED\/MQTT",
"discardExtremeValues":false,
"discardHighLimit":1.7976931348623157E308,
"discardLowLimit":-1.7976931348623157E308,
"enabled":true,
"intervalLoggingPeriod":15,
"name":"FLOAT",
"purgePeriod":1,
"textRenderer":{
"type":"PLAIN",
"suffix":""
},
"tolerance":0.0
},
{
"xid":"DP_058260",
"loggingType":"ON_CHANGE",
"intervalLoggingPeriodType":"MINUTES",
"intervalLoggingType":"INSTANT",
"purgeType":"YEARS",
"pointLocator":{
"dataType":"NUMERIC",
"binary0Value":"",
"parameterName":"INT"
},
"eventDetectors":[
],
"engineeringUnits":"",
"chartColour":null,
"chartRenderer":null,
"dataSourceXid":"DS_161663",
"defaultCacheSize":1,
"deviceName":"RECEBER NODERED\/MQTT",
"discardExtremeValues":false,
"discardHighLimit":1.7976931348623157E308,
"discardLowLimit":-1.7976931348623157E308,
"enabled":true,
"intervalLoggingPeriod":15,
"name":"INT",
"purgePeriod":1,
"textRenderer":{
"type":"PLAIN",
"suffix":""
},
"tolerance":0.0
},
{
"xid":"DP_569236",
"loggingType":"ON_CHANGE",
"intervalLoggingPeriodType":"MINUTES",
"intervalLoggingType":"INSTANT",
"purgeType":"YEARS",
"pointLocator":{
"dataType":"BINARY",
"binary0Value":"",
"parameterName":"BIN"
},
"eventDetectors":[
],
"engineeringUnits":"",
"chartColour":null,
"chartRenderer":null,
"dataSourceXid":"DS_161663",
"defaultCacheSize":1,
"deviceName":"RECEBER NODERED\/MQTT",
"discardExtremeValues":false,
"discardHighLimit":1.7976931348623157E308,
"discardLowLimit":-1.7976931348623157E308,
"enabled":true,
"intervalLoggingPeriod":15,
"name":"BIN",
"purgePeriod":1,
"textRenderer":{
"type":"PLAIN",
"suffix":""
},
"tolerance":0.0
},
{
"xid":"DP_722462",
"loggingType":"ON_CHANGE",
"intervalLoggingPeriodType":"MINUTES",
"intervalLoggingType":"INSTANT",
"purgeType":"YEARS",
"pointLocator":{
"dataType":"NUMERIC",
"binary0Value":"",
"parameterName":"FLOAT"
},
"eventDetectors":[
],
"engineeringUnits":"",
"chartColour":null,
"chartRenderer":null,
"dataSourceXid":"DS_161663",
"defaultCacheSize":1,
"deviceName":"RECEBER NODERED\/MQTT",
"discardExtremeValues":false,
"discardHighLimit":1.7976931348623157E308,
"discardLowLimit":-1.7976931348623157E308,
"enabled":true,
"intervalLoggingPeriod":15,
"name":"FLOAT",
"purgePeriod":1,
"textRenderer":{
"type":"PLAIN",
"suffix":""
},
"tolerance":0.0
}
],
"scheduledEvents":[
],
"compoundEventDetectors":[
],
"pointLinks":[
],
"users":[
{
"admin":true,
"disabled":false,
"email":"admin@yourMangoDomain.com",
"homeUrl":"",
"password":"0DPiKuNIrrVmD8IUCuw1hQxNqZc=",
"phone":"",
"receiveOwnAuditEvents":false,
"userProfile":0,
"username":"admin"
}
],
"mailingLists":[
],
"publishers":[
{
"xid":"PUB_190018",
"type":"HTTP_SENDER",
"points":[
{
"dataPointId":"DP_114918",
"includeTimestamp":false,
"parameterName":"BIN"
},
{
"dataPointId":"DP_600541",
"includeTimestamp":false,
"parameterName":"FLOAT"
},
{
"dataPointId":"DP_052981",
"includeTimestamp":false,
"parameterName":"INT"
}
],
"snapshotSendPeriodType":"SECONDS",
"dateFormat":"DATE_FORMAT_BASIC",
"cacheWarningSize":10000,
"changesOnly":false,
"enabled":true,
"name":"ENVIAR PARA NODERED",
"raiseResultWarning":true,
"sendSnapshot":true,
"snapshotSendPeriods":30,
"staticHeaders":[
],
"staticParameters":[
],
"url":"http:\/\/localhost:1880\/nodered",
"usePost":false
}
],
"pointHierarchy":[
],
"eventHandlers":[
],
"watchLists":[
{
"xid":"WL_757103",
"user":"admin",
"dataPoints":[
"DP_114918",
"DP_600541",
"DP_052981",
"DP_569236",
"DP_722462",
"DP_058260"
],
"sharingUsers":[
],
"name":"(sem nome)"
}
],
"maintenanceEvents":[
],
"scripts":[
],
"systemSettings":[
{
"filedata.path":"~\/WEB-INF\/filedata",
"reportPurgePeriods":1,
"language":"pt",
"futureDateLimitPeriodType":3,
"httpClientProxyUsername":"",
"eventPurgePeriodType":7,
"httpClientProxyPort":-1,
"httpdsPrologue":"",
"uiPerformance":2000,
"emailSmtpHost":"",
"plotGridlineColour":"silver",
"emailSmtpPassword":"",
"httpdsEpilogue":"",
"databaseSchemaVersion":"1.2.0",
"emailFromAddress":"",
"groveLogging":false,
"reportPurgePeriodType":6,
"futureDateLimitPeriods":24,
"plotBackgroundColour":"white",
"httpClientProxyPassword":"",
"instanceDescription":"ScadaBR 1.2",
"emailFromName":"ScadaBR",
"newVersionNotificationLevel":"S",
"emailSmtpPort":25,
"httpClientProxyServer":"",
"chartBackgroundColour":"white",
"emailSmtpUsername":"",
"eventPurgePeriods":1
}
]
}
Json Node-RED
[
{
"id": "d91d72c8e2657eef",
"type": "tab",
"label": "ScadaBR / Node-RED",
"disabled": false,
"info": "",
"env": []
},
{
"id": "af07bd6f91ed13b4",
"type": "http in",
"z": "d91d72c8e2657eef",
"name": "",
"url": "/nodered",
"method": "get",
"upload": false,
"swaggerDoc": "",
"x": 150,
"y": 80,
"wires": [
[
"7b8bc56509da3d01",
"915e1e522de500f0",
"6d4983fb09b63e74"
]
]
},
{
"id": "915e1e522de500f0",
"type": "template",
"z": "d91d72c8e2657eef",
"name": "",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "",
"output": "str",
"x": 360,
"y": 80,
"wires": [
[
"4f89aa1c956570ef"
]
]
},
{
"id": "4f89aa1c956570ef",
"type": "http response",
"z": "d91d72c8e2657eef",
"name": "",
"statusCode": "",
"headers": {},
"x": 510,
"y": 80,
"wires": []
},
{
"id": "7b8bc56509da3d01",
"type": "split",
"z": "d91d72c8e2657eef",
"name": "",
"splt": "\\n",
"spltType": "str",
"arraySplt": 1,
"arraySpltType": "len",
"stream": false,
"addname": "",
"x": 350,
"y": 160,
"wires": [
[
"40bfbd2cdbfa2437"
]
]
},
{
"id": "40bfbd2cdbfa2437",
"type": "switch",
"z": "d91d72c8e2657eef",
"name": "",
"property": "parts.key",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "BIN",
"vt": "str"
},
{
"t": "eq",
"v": "INT",
"vt": "str"
},
{
"t": "eq",
"v": "FLOAT",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 3,
"x": 510,
"y": 160,
"wires": [
[
"6df59cd2d42bf5d3",
"37068b31e9434fee"
],
[
"e4f16e364b94bd7d",
"61735ccce32ef5b4"
],
[
"bb702970264575d4",
"eced54c26ca29ab9"
]
]
},
{
"id": "6df59cd2d42bf5d3",
"type": "mqtt out",
"z": "d91d72c8e2657eef",
"name": "",
"topic": "BIN",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "58ca3c9651cb1016",
"x": 670,
"y": 100,
"wires": []
},
{
"id": "e4f16e364b94bd7d",
"type": "mqtt out",
"z": "d91d72c8e2657eef",
"name": "",
"topic": "INT",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "58ca3c9651cb1016",
"x": 670,
"y": 160,
"wires": []
},
{
"id": "bb702970264575d4",
"type": "mqtt out",
"z": "d91d72c8e2657eef",
"name": "",
"topic": "FLOAT",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "58ca3c9651cb1016",
"x": 680,
"y": 220,
"wires": []
},
{
"id": "f0a957ea74458407",
"type": "join",
"z": "d91d72c8e2657eef",
"name": "",
"mode": "custom",
"build": "object",
"property": "payload",
"propertyType": "msg",
"key": "topic",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "1",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 340,
"y": 400,
"wires": [
[
"c8bb18a6875c200b",
"3e0770a11635f2f3"
]
]
},
{
"id": "c8bb18a6875c200b",
"type": "http request",
"z": "d91d72c8e2657eef",
"name": "http://localhost:8080/ScadaBR/httpds",
"method": "GET",
"ret": "txt",
"paytoqs": "query",
"url": "http://localhost:8080/ScadaBR/httpds",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 610,
"y": 400,
"wires": [
[
"58cee4ca60010472"
]
]
},
{
"id": "8f5c5f5d81e5e368",
"type": "mqtt in",
"z": "d91d72c8e2657eef",
"name": "",
"topic": "BIN",
"qos": "0",
"datatype": "auto-detect",
"broker": "58ca3c9651cb1016",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 130,
"y": 400,
"wires": [
[
"f0a957ea74458407"
]
]
},
{
"id": "a8b7d4fc0e2e166b",
"type": "mqtt in",
"z": "d91d72c8e2657eef",
"name": "",
"topic": "INT",
"qos": "2",
"datatype": "auto-detect",
"broker": "58ca3c9651cb1016",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 130,
"y": 460,
"wires": [
[
"f0a957ea74458407"
]
]
},
{
"id": "7945d4fe5a11a867",
"type": "mqtt in",
"z": "d91d72c8e2657eef",
"name": "",
"topic": "FLOAT",
"qos": "2",
"datatype": "auto-detect",
"broker": "58ca3c9651cb1016",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 130,
"y": 520,
"wires": [
[
"f0a957ea74458407"
]
]
},
{
"id": "37068b31e9434fee",
"type": "debug",
"z": "d91d72c8e2657eef",
"name": "debug 12",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 820,
"y": 100,
"wires": []
},
{
"id": "61735ccce32ef5b4",
"type": "debug",
"z": "d91d72c8e2657eef",
"name": "debug 13",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 820,
"y": 160,
"wires": []
},
{
"id": "eced54c26ca29ab9",
"type": "debug",
"z": "d91d72c8e2657eef",
"name": "debug 14",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 820,
"y": 220,
"wires": []
},
{
"id": "3e0770a11635f2f3",
"type": "debug",
"z": "d91d72c8e2657eef",
"name": "debug 15",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 520,
"y": 460,
"wires": []
},
{
"id": "58cee4ca60010472",
"type": "debug",
"z": "d91d72c8e2657eef",
"name": "debug 16",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 880,
"y": 400,
"wires": []
},
{
"id": "6d4983fb09b63e74",
"type": "debug",
"z": "d91d72c8e2657eef",
"name": "debug 17",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 380,
"y": 220,
"wires": []
},
{
"id": "3e702301bc94383d",
"type": "comment",
"z": "d91d72c8e2657eef",
"name": "RECEBE DADOS SCADABR E ENVIA PARA O BROKER",
"info": "",
"x": 290,
"y": 40,
"wires": []
},
{
"id": "bfb272f9a40d66da",
"type": "comment",
"z": "d91d72c8e2657eef",
"name": "RECEBE DADOS DO BROKER E ENVIA PARA O SCADABR",
"info": "",
"x": 300,
"y": 360,
"wires": []
},
{
"id": "58ca3c9651cb1016",
"type": "mqtt-broker",
"name": "",
"broker": "localhost",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"autoUnsubscribe": true,
"birthTopic": "",
"birthQos": "0",
"birthRetain": "false",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closeRetain": "false",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willRetain": "false",
"willPayload": "",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
}
]
Boa Sorte!!