背景
自复位开关->modbus DI模块->node-red->modbus DO模块->继电器->设备(灯具或插座)
参照003篇,已经成功接入两个模块。
思路
在nr里定义一个变量用来记录设备状态,所有的操控都是直接操作这个变量,然后用变量去控制相应的设备。
这样,无论控制源是开关、语音助手、传感器、场景、人工智能等都转化为对变量的直接操控。
变量可以储存为全局变量或者写入数据库。
var switchCFD = {payload:{power:true,lm:100,colortemperature:100}};
var socketTV = {payload:{power:true}};
var fanNewAir = {payload:{power:true,grade:1}};
然后通过写modbus操作统一改变设备状态。
包括接入的米家设备、mqtt设备等都是通过这个思路来更改状态。
演示
整体流预览
1、初始化,定义全局变量,写入初始状态。
2、获取按键状态、改变全局变量
3、预览
4、演示流
[
{
"id": "57b89f19.5a761",
"type": "inject",
"z": "f62cb442.d1aef",
"name": "",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "0.2",
"crontab": "",
"once": true,
"onceDelay": "0",
"x": 100,
"y": 360,
"wires": [
[
"e82fb085.3fbf8",
"821476c.4284d88"
]
]
},
{
"id": "5aceaa2f.2006ac",
"type": "inject",
"z": "f62cb442.d1aef",
"name": "初始化",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": "0",
"x": 100,
"y": 300,
"wires": [
[
"2874b18e.b524ce"
]
]
},
{
"id": "2874b18e.b524ce",
"type": "function",
"z": "f62cb442.d1aef",
"name": "定义状态数组",
"func": "var VswitchCFD = {payload:{power:false,lm:100,colortemperature:100}};\nvar VsocketTV = {payload:{power:false}};\nvar VfanNewAir = {payload:{power:false,grade:0}};\nglobal.set('switchCFD',VswitchCFD);\nglobal.set('socketTV',VsocketTV);\nglobal.set('fanNewAir',VfanNewAir);\n\nreturn;",
"outputs": 0,
"noerr": 0,
"x": 280,
"y": 300,
"wires": []
},
{
"id": "e82fb085.3fbf8",
"type": "function",
"z": "f62cb442.d1aef",
"name": "Read 0-2 on Unit 1 FC2",
"func": "msg.payload = { value: msg.payload, 'fc': 2, 'unitid': 1, 'address': 0 , 'quantity': 3 };\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 310,
"y": 420,
"wires": [
[
"5e3cb9b1.efd778"
]
]
},
{
"id": "821476c.4284d88",
"type": "function",
"z": "f62cb442.d1aef",
"name": "Write 0-2 on Unit 1 FC15",
"func": "var Value = [global.get('switchCFD').payload.power,global.get('socketTV').payload.power,global.get('fanNewAir').payload.power];\nmsg.payload = { value: Value, 'fc': 15, 'unitid': 1, 'address': 0 , 'quantity': 3 };\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 310,
"y": 360,
"wires": [
[
"2f8d6d5b.7aa85a"
]
]
},
{
"id": "dc4ccbea.224f8",
"type": "rbe",
"z": "f62cb442.d1aef",
"name": "",
"func": "rbe",
"gap": "",
"start": "",
"inout": "out",
"property": "payload",
"x": 710,
"y": 420,
"wires": [
[
"5ad43590.d6765c"
]
]
},
{
"id": "5e3cb9b1.efd778",
"type": "modbus-flex-getter",
"z": "f62cb442.d1aef",
"name": "获取按键状态",
"showStatusActivities": false,
"showErrors": false,
"logIOActivities": false,
"server": "54b233c9.eea30c",
"useIOFile": false,
"ioFile": "",
"useIOForPayload": false,
"x": 540,
"y": 420,
"wires": [
[
"dc4ccbea.224f8"
],
[]
]
},
{
"id": "2f8d6d5b.7aa85a",
"type": "modbus-flex-write",
"z": "f62cb442.d1aef",
"name": "更改设备状态",
"showStatusActivities": false,
"showErrors": false,
"server": "54b233c9.eea30c",
"x": 540,
"y": 360,
"wires": [
[
"7170acc1.c51154"
],
[]
]
},
{
"id": "5ad43590.d6765c",
"type": "function",
"z": "f62cb442.d1aef",
"name": "",
"func": "var value = msg.payload;\n\nvar msg0={payload:value[0]};\nvar msg1={payload:value[1]};\nvar msg2={payload:value[2]};\n\nreturn [msg0,msg1,msg2];",
"outputs": 3,
"noerr": 0,
"x": 250,
"y": 560,
"wires": [
[
"e1e76528.64858"
],
[],
[]
]
},
{
"id": "e1e76528.64858",
"type": "function",
"z": "f62cb442.d1aef",
"name": "00 厨房灯",
"func": "var Value = global.get('switchCFD');\nif(msg.payload === true)\nValue.payload.power = !Value.payload.power;\nglobal.set('switchCFD',Value);\nreturn ;",
"outputs": 0,
"noerr": 0,
"x": 400,
"y": 540,
"wires": []
},
{
"id": "9fad2eef.2d3f2",
"type": "comment",
"z": "f62cb442.d1aef",
"name": "初始化 断电、重启后执行,初始设备状态。只在最初执行一次",
"info": "",
"x": 260,
"y": 260,
"wires": []
},
{
"id": "7170acc1.c51154",
"type": "debug",
"z": "f62cb442.d1aef",
"name": "反馈设备状态",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"x": 740,
"y": 360,
"wires": []
},
{
"id": "2c486cf.a83a494",
"type": "modbus-server",
"z": "f62cb442.d1aef",
"name": "虚拟modbus",
"logEnabled": false,
"hostname": "127.0.0.1",
"serverPort": 10502,
"responseDelay": 100,
"delayUnit": "ms",
"coilsBufferSize": 10000,
"holdingBufferSize": 10000,
"inputBufferSize": 10000,
"discreteBufferSize": 10000,
"showErrors": false,
"x": 290,
"y": 100,
"wires": [
[
"770f8ac1.9ad934"
],
[
"91ad517b.724b78"
],
[
"7e004d83.580e64"
],
[
"2cbdcd7d.7e36ea"
]
]
},
{
"id": "770f8ac1.9ad934",
"type": "modbus-response",
"z": "f62cb442.d1aef",
"name": "",
"registerShowMax": 20,
"x": 630,
"y": 20,
"wires": []
},
{
"id": "91ad517b.724b78",
"type": "modbus-response",
"z": "f62cb442.d1aef",
"name": "",
"registerShowMax": 20,
"x": 630,
"y": 80,
"wires": []
},
{
"id": "7e004d83.580e64",
"type": "modbus-response",
"z": "f62cb442.d1aef",
"name": "",
"registerShowMax": 20,
"x": 630,
"y": 140,
"wires": []
},
{
"id": "2cbdcd7d.7e36ea",
"type": "modbus-response",
"z": "f62cb442.d1aef",
"name": "",
"registerShowMax": 20,
"x": 630,
"y": 200,
"wires": []
},
{
"id": "f455317d.4ec03",
"type": "inject",
"z": "f62cb442.d1aef",
"name": "",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"x": 100,
"y": 100,
"wires": [
[
"2c486cf.a83a494"
]
]
},
{
"id": "1c1973de.98f044",
"type": "comment",
"z": "f62cb442.d1aef",
"name": "虚拟modbus 演示用",
"info": "",
"x": 130,
"y": 40,
"wires": []
},
{
"id": "54b233c9.eea30c",
"type": "modbus-client",
"z": "",
"name": "",
"clienttype": "tcp",
"bufferCommands": true,
"stateLogEnabled": false,
"tcpHost": "127.0.0.1",
"tcpPort": "10502",
"tcpType": "DEFAULT",
"serialPort": "/dev/ttyUSB",
"serialType": "RTU-BUFFERD",
"serialBaudrate": "9600",
"serialDatabits": "8",
"serialStopbits": "1",
"serialParity": "none",
"serialConnectionDelay": "100",
"unit_id": "1",
"commandDelay": "1",
"clientTimeout": "1000",
"reconnectOnTimeout": true,
"reconnectTimeout": "2000",
"parallelUnitIdsAllowed": true
}]