智能家居填坑004 Modbus接入逻辑篇

背景

自复位开关->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
}]

上一篇 https://bbs.iobroker.cn/t/topic/1727

感谢分享,好帅气的布线

大神,想仔细研究学习,同需求,不太懂怎么分开控制,能否完整的控制流发一下,感谢

是获取整个寄存器的内容,再根据内容去改变各个设备的状态变量,再把所有变量组合成一串数据去写寄存器