Skip to content

Example 1 Environment Monitor

Hardware Preparation


Pi Terminal CrowPanel ESP32 3.5'' HMI Crowtail-DHT20
pi-terminal CrowPanel-ESP32-3-5inch CROWTAIL-DHT20
BUYNOW BUYNOW BUYNOW

Project Function Description


project-illustration

  • Connect the DHT20 to CrowPanel ESP32 3.5‘’ HMI to obtain temperature and humidity data, and publish the data through MQTT.
  • The MQTT server is deployed in Pi Terminal, and both HMI and Pi Terminal are connected to the same WiFi.
  • Then Pi Terminal subscribes to the temperature and humidity data published by HMI through MQTT, and display them on node red.

How to achieve the above functions


Set up an MQTT server on the Pi Terminal.

If you are using the image we provided, the mosquitto software is installed, and it will automatically enable when you power on the Pi Terminal.

If you haven't install the mosquitto, you can get it from GitHub and install it, and then use the command mosquitto - c~/mosquitto -1.5.4/mosquitto. conf - v to enable the MQTT server.

Mosquitto

After installing the mosquitto software, there will be a mosquitto.exe file in the installation directory (mosquitto is installed in the/etc/directory by default), which is the startup configuration file for mosquitto. We can modify some configurations of the mosquitto server by changing the contents of this file. For example, the server account, password, and so on.

Go to the /etc/mosquitto/directory and use command sudo vim mosquitto. conf to open the configuration file

mosquitto-1

As we can see, there are also some explanations and the paths to other configuration files and logs inside. What we need to focus on is the last line 'including. dir/etc/mosquitto/conf. d'. We entered this directory.

mosquitto-2

There are three files in this directory. First, we open the README and check the instructions. We can see that the configuration file we need is the .conf file. Open the mosquitto. conf file

mosquitto-4

You can see that the first two lines inside indicate that our password is configured in the pwfile file in the same level directory The fourth and fifth lines indicate whether anonymous login is allowed (i.e. whether password login is required), and the current setting value is false, which means that a password is not required to log in to the server. If true is set, this password needs to be entered in the specified password file (pwfile). It is necessary to specify the port number that the server needs to listen to, which is set to 1883 (the commonly used MQTT listening port number, not recommended to be modified).

Upload the code to the CrowPanel ESP32 HMI

  1. Upload the code to the CrowPanel ESP32 3.5'' HMI for temperature and humidity detection MQTT data transmission.

    Please click downloadto download the CrowPanel-3.5inch-HMI_Read_DHT20_Data.zip.

    Please click GetStarted to learn about how to upload the code.

    Note:

    Before uploading the code, please modify the WiFi name and password, and MQTT IP address, username and password first.

    modify-code

  2. After uploading the code, you can see there are data from DHT20 shown on the ESP32 HMI. And open the serial monitor, you can see the HMI has connected to Pi Terminal's MQTT server and successfully sent data.

    hmi

    serial-monitor

  3. Now, the data communication between ESP32 HMI and Pi Terminal has been established, and the next step is to show the data on Node Red.

Set node red environment monitoring process

mqtt in node

  1. Firstly, drag and drop two mqtt in nodes to subscribe to temperature and humidity data published by HMI.

    add-mqtt-in

  2. Double click the node for configuration. Then click "Done".

    edit-mqtt-in-node

  3. Our MQTT server is deployed locally, so simply fill in the local loopback IP address 127.0.0.1 at the server location. As for the port, use the port number 1883 monitored by the previously enabled MQTT server. Then click "Update".

    edit-mqtt-in-node-1

  4. Fill in the topics you need to subscribe. One is for temperature, and the other is for humidity

    edit-mqtt-in-node-2

  5. Similarly, another node that subscribes to humidity should also be set up according to the above instructions.

    edit-mqtt-in-node-3

debug node

With the above two output nodes and successful configuration, you can connect to the debug node to debug and print information. Connect the debug node to the mqtt in node.

debug-node

After obtaining the data, it can be output to the Dashboard node and displayed on the UI interface.

gauge node

gauge

For example, use a gauge node to show the real-time value, and the gauge node configuration is as follows:

Edit gauge node 1 Edit gauge node 2 Edit gauge node 3
gauge1 gauge2 gauge3
  1. Enter "Edit dashboard group node" by clicking the edit button of "Group" item. Subsequently click the edit button of the "Tab" item to enter "Edit dashboard tab node". Set the name of the tab node.

    Here we name it "Elecrow for industry". After that, click "Update" to return to the previous page.

  2. Click the drop down menu of the Tab, and select the panel name "Elecrow for industry" we created. In this way, the temperature and humidity gauge will be displayed on "Elecrow for industry" panel. Then fill in the name "TempAndHumi" in the Name section, so that the temperature dashboard will be limited to the "TempAndHumi" sub box in the "Elecrow for industry" panel.

    panel

  3. Update and go back to the previous page. You can set the style, range, name(Label), scale unit, interval color, and more of the gauge.

    Set "Temp" label for temperature date, and "Humi" label for humidity data.

    set-gauge

  4. Click "Done" to save the setting.

  5. Connect them separately to the mqtt in nodes for subscribing to temperature and humidity.

chart node

cahrt

We can also use chart node to show the date of temperature and humidity in the recent hour.

  1. Double click the chart node. Select the [Elecrow for industry] TempAndHumi for the "Group". (If you have not created the panel, please follow the gauge node settings above to create it)

    chart-setting

  2. Set "TemperatureChart" label for temperature date, and "HumidityChart" label for humidity data.

  3. Connect them separately to the mqtt in nodes for subscribing to temperature and humidity.

function node and switch node

Next, we will add LED, buzzer, and relay module.

  • When MQTT receiving data, the LED lights up;
  • When the temperature exceeds the set value, the buzzer sounds and the relay turns on for cooling operation.
  • Set the switch on the node red panel, so we can manually turn on and off the above modules

We need to use function node and switch node to realize them.

LED

If MQTT detects data arrival, then let the USER_LED light up LED.

  1. Double click the function node for configuration.

  2. Fill in the following code to the "On Massage" part.

    var isValid = false;    
    
    if (typeof msg.payload === 'number' && !isNaN(msg.payload)) {   
        isValid = true;    
    }   
    msg.payload = isValid;   
    return msg;   
    
  3. Connect the upstream node of this function node to two MQTT subscription nodes, and connect the downstream output node to the switch node of user_1ed

    led-connect

  4. Add a switch node.

    Here I create a new tab node "PCA9577" to collect the switches in a sub box. Select "[Elecrow for industry] PCA9557" for the Group.

    user-led

  5. Because the led is connected to the PCA9557 IC, we need to control the IC to turn on/off the led. However, the control logic of this node requires selecting the corresponding pin number connected to the IC, as well as choosing whether to assign a high or low level, i.e. 0 or 1. The output information of the node that controls the switch is a boolean value. Therefore, we need to add a function node between the node that controls the switch and the pca9557 control node(customized node), and write the conversion function.

    led-func

    let outputmsgs = {};
    outputmsgs.pin = 1;
    outputmsgs.val = msg.payload ? 1 : 0;
    msg.outputmsgs = outputmsgs;
    return msg;
    
  6. Please turn back to Pi Terminal Node Red Tutorial to check how to create customized node. And click NodeRed-nodes.zip to download the customized node we created for reference.

  7. Connect nodes together to form a complete control chain.

    led-control

The next step is to set the nodes in the same way for the buzzer and relay.

The node content and functions are as follows:

function for buzzer

var temp = msg.payload;
var isHot = false;
if (temp > 65) {
    isHot = true;
} else {
    isHot = false;
}
msg.payload = isHot;
return msg;

function for relay

var temp = msg.payload;
var isWet = false;
if (temp > 65) {
    isWet = true;
} else {
    isWet = false;
}
msg.payload = isWet;
return msg;

switch node for buzzer

buzzer-switch

switch node for relay

relay-switch

buzzer_func

buzzer_func

let outputmsgs = {};
outputmsgs.pin = 0;
outputmsgs.val = msg.payload ? 0 : 1;
msg.outputmsgs = outputmsgs;
return msg;

relay_func

relay_func

let outputmsgs = {};
outputmsgs.pin = 7;
outputmsgs.val = msg.payload ? 1 : 0;
msg.outputmsgs = outputmsgs;
return msg;

After completing the above configuration, the complete flowchart is as follows:

flowchart

Enter the URL: 127.0.0.1 in the browser to access the corresponding ui panel.

dashboard

In the UI, the temp and humi gauge can monitor the environmental temperature and humidity in real time, and there is also a chart below to record the temperature and humidity data of the environment in the past hour. When the temperature exceeds a certain threshold, the buzzer will sound to remind the management personnel to execute cooling operations, and at the same time, the relay will be turned on to turn on the corresponding cooling equipment for cooling. Moreover, there are also buttons for users to manually operate, allowing them to manually turn on buzzers, user lights, and relays in the UI screen.

Expand: How to import JSON files

Open the NodeRed, click the menu,and select Import.

import1

Then click "select a file to import" in the import section and choose the corresponding JSON file to import.

import2

Alternatively, you can copy and paste all the contents of the JSON file into the panel, and click on 'import' to complete the process.

The following is the JSON file of the nodes that have been arranged for the flow. Simply import it into NodeRed and you get the complete flow.

Please download the file at: Industrial_App.json

[
    {
        "id": "296e2b77b8d592a4",
        "type": "tab",
        "label": "flow 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "089c4f456019ed8a",
        "type": "i2c scan",
        "z": "296e2b77b8d592a4",
        "name": "",
        "busno": "1",
        "x": 260,
        "y": 80,
        "wires": [
            [
                "663dfbdcb4b2cf70"
            ],
            []
        ]
    },
    {
        "id": "388c2db285083642",
        "type": "inject",
        "z": "296e2b77b8d592a4",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 110,
        "y": 80,
        "wires": [
            [
                "089c4f456019ed8a"
            ]
        ]
    },
    {
        "id": "663dfbdcb4b2cf70",
        "type": "debug",
        "z": "296e2b77b8d592a4",
        "name": "i2c scan",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 400,
        "y": 80,
        "wires": []
    },
    {
        "id": "1528f93b8776f392",
        "type": "serial in",
        "z": "296e2b77b8d592a4",
        "name": "",
        "serial": "5f3c9c64d34d1690",
        "x": 110,
        "y": 340,
        "wires": [
            [
                "8f8b0968812ceb53",
                "ce0686791dae5f08"
            ]
        ]
    },
    {
        "id": "8f8b0968812ceb53",
        "type": "debug",
        "z": "296e2b77b8d592a4",
        "name": "ttyAMA2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 260,
        "y": 320,
        "wires": []
    },
    {
        "id": "a3989e0830227d80",
        "type": "serial out",
        "z": "296e2b77b8d592a4",
        "name": "",
        "serial": "5f3c9c64d34d1690",
        "x": 370,
        "y": 260,
        "wires": []
    },
    {
        "id": "304c417f5d042cc2",
        "type": "ui_text_input",
        "z": "296e2b77b8d592a4",
        "d": true,
        "name": "",
        "label": "Serial RS485 inputBrowser",
        "tooltip": "",
        "group": "d82c0c4024caa8bb",
        "order": 2,
        "width": 15,
        "height": 3,
        "passthru": true,
        "mode": "text",
        "delay": 300,
        "topic": "topic",
        "sendOnBlur": true,
        "className": "",
        "topicType": "msg",
        "x": 160,
        "y": 260,
        "wires": [
            [
                "a3989e0830227d80"
            ]
        ]
    },
    {
        "id": "ce0686791dae5f08",
        "type": "ui_text",
        "z": "296e2b77b8d592a4",
        "d": true,
        "group": "d82c0c4024caa8bb",
        "order": 1,
        "width": 15,
        "height": 3,
        "name": "",
        "label": "RS485 Recv:",
        "format": "{{msg.payload}}",
        "layout": "col-center",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 270,
        "y": 360,
        "wires": []
    },
    {
        "id": "e2701f86723f32fe",
        "type": "camerapi-takephoto",
        "z": "296e2b77b8d592a4",
        "d": true,
        "filemode": "1",
        "filename": "test",
        "filedefpath": "1",
        "filepath": "",
        "fileformat": "jpeg",
        "resolution": "5",
        "rotation": "0",
        "fliph": "0",
        "flipv": "0",
        "brightness": "50",
        "contrast": "0",
        "sharpness": "0",
        "quality": "80",
        "imageeffect": "none",
        "exposuremode": "auto",
        "iso": "0",
        "agcwait": "1.0",
        "led": "0",
        "awb": "auto",
        "name": "",
        "x": 800,
        "y": 80,
        "wires": [
            [
                "d3fd475208796dcb",
                "b51c32df.79e9f"
            ]
        ]
    },
    {
        "id": "4ffc86a9e1cd1bb6",
        "type": "inject",
        "z": "296e2b77b8d592a4",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 650,
        "y": 80,
        "wires": [
            [
                "e2701f86723f32fe"
            ]
        ]
    },
    {
        "id": "d3fd475208796dcb",
        "type": "debug",
        "z": "296e2b77b8d592a4",
        "name": "camera",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 960,
        "y": 60,
        "wires": []
    },
    {
        "id": "b51c32df.79e9f",
        "type": "file in",
        "z": "296e2b77b8d592a4",
        "name": "",
        "filename": "/home/pi/Pictures/test.png",
        "filenameType": "str",
        "format": "",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 1010,
        "y": 100,
        "wires": [
            [
                "b1a56d30.85714"
            ]
        ]
    },
    {
        "id": "b1a56d30.85714",
        "type": "base64",
        "z": "296e2b77b8d592a4",
        "name": "",
        "action": "str",
        "property": "payload",
        "x": 980,
        "y": 160,
        "wires": [
            [
                "eec9916b.6e4a5"
            ]
        ]
    },
    {
        "id": "eec9916b.6e4a5",
        "type": "ui_template",
        "z": "296e2b77b8d592a4",
        "d": true,
        "group": "eea09010a27bf209",
        "name": "Display Image",
        "order": 2,
        "width": 9,
        "height": 6,
        "format": "<img src=\"data:image/png;base64,{{msg.payload}}\" style=\"width: 100%; height: auto;\">",
        "storeOutMessages": true,
        "fwdInMessages": true,
        "resendOnRefresh": true,
        "templateScope": "local",
        "className": "",
        "x": 1140,
        "y": 160,
        "wires": [
            []
        ]
    },
    {
        "id": "370e29202ac60e84",
        "type": "mqtt in",
        "z": "296e2b77b8d592a4",
        "name": "",
        "topic": "esp32/temperature",
        "qos": "1",
        "datatype": "auto-detect",
        "broker": "6193b9767af23365",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 650,
        "y": 340,
        "wires": [
            [
                "e51c619ee53ed1b1",
                "ee5826485085c291",
                "e939bd5f6eb1760d",
                "0cd16018e9ac2ca1",
                "14c042f5ef232bee"
            ]
        ]
    },
    {
        "id": "e51c619ee53ed1b1",
        "type": "debug",
        "z": "296e2b77b8d592a4",
        "name": "from esp32 temp detect",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 890,
        "y": 300,
        "wires": []
    },
    {
        "id": "2f77ba2d9a1e5c51",
        "type": "mqtt in",
        "z": "296e2b77b8d592a4",
        "name": "",
        "topic": "esp32/humidity",
        "qos": "1",
        "datatype": "auto-detect",
        "broker": "6193b9767af23365",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 660,
        "y": 500,
        "wires": [
            [
                "5fbe4c8f66dd145f",
                "104349049b20fd8a",
                "0cd16018e9ac2ca1",
                "1a80c677c7de4dce",
                "e9126f3218b8a8b7"
            ]
        ]
    },
    {
        "id": "5fbe4c8f66dd145f",
        "type": "debug",
        "z": "296e2b77b8d592a4",
        "name": "from esp32 humi detect",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 890,
        "y": 460,
        "wires": []
    },
    {
        "id": "ee5826485085c291",
        "type": "ui_gauge",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 2,
        "width": 10,
        "height": 6,
        "gtype": "gage",
        "title": "Temp",
        "label": "℃",
        "format": "{{value}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "30",
        "seg2": "65",
        "diff": false,
        "className": "",
        "x": 830,
        "y": 380,
        "wires": []
    },
    {
        "id": "5496e5b6dbd2dd64",
        "type": "pca9557",
        "z": "296e2b77b8d592a4",
        "name": "",
        "pin": "0",
        "value": "1",
        "x": 1540,
        "y": 380,
        "wires": [
            []
        ],
        "icon": "node-red/rpi.svg"
    },
    {
        "id": "3a59e0f7c8aa23e8",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "d": true,
        "name": "",
        "label": "RS485 Send Enable",
        "tooltip": "",
        "group": "d82c0c4024caa8bb",
        "order": 3,
        "width": 0,
        "height": 0,
        "passthru": true,
        "decouple": "false",
        "topic": "topic",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 140,
        "y": 200,
        "wires": [
            [
                "d1cf74645d931c2a"
            ]
        ]
    },
    {
        "id": "d1cf74645d931c2a",
        "type": "rpi-gpio out",
        "z": "296e2b77b8d592a4",
        "name": "",
        "pin": "11",
        "set": true,
        "level": "0",
        "freq": "",
        "out": "out",
        "bcm": true,
        "x": 320,
        "y": 200,
        "wires": []
    },
    {
        "id": "26d3dc888473e7ac",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "RS485 control",
        "info": "",
        "x": 110,
        "y": 160,
        "wires": []
    },
    {
        "id": "df5794b8c0e40492",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "PCA9557 control ",
        "info": "",
        "x": 1260,
        "y": 280,
        "wires": []
    },
    {
        "id": "188a9706e4f022fc",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "user led",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 1,
        "width": 8,
        "height": 1,
        "passthru": true,
        "decouple": "false",
        "topic": "payload",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 1240,
        "y": 320,
        "wires": [
            [
                "0989cd0ce8703a4a"
            ]
        ]
    },
    {
        "id": "3137b177f52689b4",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "buzzer",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 3,
        "width": 8,
        "height": 1,
        "passthru": true,
        "decouple": "false",
        "topic": "buz",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 1230,
        "y": 380,
        "wires": [
            [
                "71bd0d75d54a8d9a"
            ]
        ]
    },
    {
        "id": "b09049a3266a85df",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "relay",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 5,
        "width": 8,
        "height": 1,
        "passthru": true,
        "decouple": "false",
        "topic": "rel",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 1230,
        "y": 440,
        "wires": [
            [
                "bc266d9df5cdbde2"
            ]
        ]
    },
    {
        "id": "0989cd0ce8703a4a",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "led_func",
        "func": "let outputmsgs = {};\noutputmsgs.pin = 1;\noutputmsgs.val = msg.payload ? 1 : 0;\nmsg.outputmsgs = outputmsgs;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1380,
        "y": 320,
        "wires": [
            [
                "5496e5b6dbd2dd64"
            ]
        ]
    },
    {
        "id": "71bd0d75d54a8d9a",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "buzzer_func",
        "func": "let outputmsgs = {};\noutputmsgs.pin = 0;\noutputmsgs.val = msg.payload ? 0 : 1;\nmsg.outputmsgs = outputmsgs;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1370,
        "y": 380,
        "wires": [
            [
                "5496e5b6dbd2dd64"
            ]
        ]
    },
    {
        "id": "bc266d9df5cdbde2",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "relay_func",
        "func": "let outputmsgs = {};\noutputmsgs.pin = 7;\noutputmsgs.val = msg.payload ? 1 : 0;\nmsg.outputmsgs = outputmsgs;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1370,
        "y": 440,
        "wires": [
            [
                "5496e5b6dbd2dd64"
            ]
        ]
    },
    {
        "id": "041e89b05047a272",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "MQTT receive HMI temo and humi data",
        "info": "",
        "x": 710,
        "y": 260,
        "wires": []
    },
    {
        "id": "2e21b235214e9837",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "scan iic address",
        "info": "",
        "x": 120,
        "y": 40,
        "wires": []
    },
    {
        "id": "104349049b20fd8a",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "function 1",
        "func": "var temp = msg.payload;\nvar isWet = false;\nif (temp > 65) {\n    isWet = true;\n} else {\n    isWet = false;\n}\nmsg.payload = isWet;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 440,
        "wires": [
            [
                "b09049a3266a85df"
            ]
        ]
    },
    {
        "id": "e939bd5f6eb1760d",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "function 2",
        "func": "var temp = msg.payload;\nvar isHot = false;\nif (temp > 65) {\n    isHot = true;\n} else {\n    isHot = false;\n}\nmsg.payload = isHot;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 380,
        "wires": [
            [
                "3137b177f52689b4"
            ]
        ]
    },
    {
        "id": "0cd16018e9ac2ca1",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "function 3",
        "func": "var isValid = false;\n\nif (typeof msg.payload === 'number' && !isNaN(msg.payload)) {\n    isValid = true;\n}\nmsg.payload = isValid;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 320,
        "wires": [
            [
                "188a9706e4f022fc"
            ]
        ]
    },
    {
        "id": "1a80c677c7de4dce",
        "type": "ui_chart",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 3,
        "width": 10,
        "height": 6,
        "label": "humidityChart",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "0",
        "ymax": "100",
        "removeOlder": "2",
        "removeOlderPoints": "",
        "removeOlderUnit": "3600",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "outputs": 1,
        "useDifferentColor": false,
        "className": "",
        "x": 860,
        "y": 500,
        "wires": [
            []
        ]
    },
    {
        "id": "14c042f5ef232bee",
        "type": "ui_chart",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 4,
        "width": 10,
        "height": 6,
        "label": "temperatureChart",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": true,
        "ymin": "0",
        "ymax": "100",
        "removeOlder": "2",
        "removeOlderPoints": "",
        "removeOlderUnit": "3600",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "outputs": 1,
        "useDifferentColor": false,
        "className": "",
        "x": 870,
        "y": 340,
        "wires": [
            []
        ]
    },
    {
        "id": "e9126f3218b8a8b7",
        "type": "ui_gauge",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 1,
        "width": 10,
        "height": 6,
        "gtype": "gage",
        "title": "Humi",
        "label": "%",
        "format": "{{value}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "50",
        "seg2": "60",
        "diff": false,
        "className": "",
        "x": 830,
        "y": 540,
        "wires": []
    },
    {
        "id": "25f46aa08259ec52",
        "type": "ui_slider",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "temp controler",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 7,
        "width": 6,
        "height": 1,
        "passthru": true,
        "outs": "all",
        "topic": "topic",
        "topicType": "msg",
        "min": 0,
        "max": "30",
        "step": 1,
        "className": "",
        "x": 1220,
        "y": 520,
        "wires": [
            [
                "c918a83333fb4940"
            ]
        ]
    },
    {
        "id": "c918a83333fb4940",
        "type": "ui_gauge",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "305aba498b652f78",
        "order": 8,
        "width": 5,
        "height": 5,
        "gtype": "donut",
        "title": "temp controler info",
        "label": "units",
        "format": "{{value}}",
        "min": 0,
        "max": "30",
        "colors": [
            "#00b500",
            "#0058e6",
            "#ca3838"
        ],
        "seg1": "16",
        "seg2": "26",
        "diff": false,
        "className": "",
        "x": 1410,
        "y": 520,
        "wires": []
    },
    {
        "id": "9a54579b3808f531",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 1,
        "width": 1,
        "height": 1
    },
    {
        "id": "bdd726f46e44ddbd",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 3,
        "width": 2,
        "height": 1
    },
    {
        "id": "097a0ebc80c7d4cd",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 4,
        "width": 1,
        "height": 1
    },
    {
        "id": "6d5425bbc2ca3232",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 5,
        "width": 2,
        "height": 1
    },
    {
        "id": "ae38f0e15b5a1ddb",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 6,
        "width": 1,
        "height": 1
    },
    {
        "id": "65cd654e7f67f096",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 7,
        "width": 2,
        "height": 1
    },
    {
        "id": "bcfd0798aa4b16ef",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 8,
        "width": 1,
        "height": 1
    },
    {
        "id": "64b1cc3aea755c98",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 9,
        "width": 2,
        "height": 1
    },
    {
        "id": "0d20f3b73ddb4758",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 10,
        "width": 1,
        "height": 1
    },
    {
        "id": "1d38b98ef1126178",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 11,
        "width": 2,
        "height": 1
    },
    {
        "id": "216d9a1fb8258924",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 12,
        "width": 1,
        "height": 1
    },
    {
        "id": "d3219b425bd00599",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 13,
        "width": 2,
        "height": 1
    },
    {
        "id": "d7c9dfa7e24b4cff",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "305aba498b652f78",
        "order": 2,
        "width": 1,
        "height": 1
    },
    {
        "id": "4c000b5e0ffd18d8",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "305aba498b652f78",
        "order": 4,
        "width": 1,
        "height": 1
    },
    {
        "id": "0c497df34323570e",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "305aba498b652f78",
        "order": 6,
        "width": 1,
        "height": 1
    },
    {
        "id": "5f3c9c64d34d1690",
        "type": "serial-port",
        "name": "",
        "serialport": "/dev/ttyAMA2",
        "serialbaud": "9600",
        "databits": "8",
        "parity": "none",
        "stopbits": "1",
        "waitfor": "",
        "dtr": "none",
        "rts": "none",
        "cts": "none",
        "dsr": "none",
        "newline": "\\n",
        "bin": "false",
        "out": "char",
        "addchar": "\\n",
        "responsetimeout": "10000"
    },
    {
        "id": "d82c0c4024caa8bb",
        "type": "ui_group",
        "name": "Serial",
        "tab": "6c0499d7f0e978bb",
        "order": 4,
        "disp": true,
        "width": 15,
        "collapse": true,
        "className": ""
    },
    {
        "id": "eea09010a27bf209",
        "type": "ui_group",
        "d": true,
        "name": "camera",
        "tab": "6c0499d7f0e978bb",
        "order": 2,
        "disp": true,
        "width": "12",
        "collapse": false,
        "className": ""
    },
    {
        "id": "6193b9767af23365",
        "type": "mqtt-broker",
        "name": "",
        "broker": "127.0.0.1",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "nodered-in",
        "birthQos": "1",
        "birthRetain": "false",
        "birthPayload": "node-red in",
        "birthMsg": {},
        "closeTopic": "nodered-out",
        "closeQos": "1",
        "closeRetain": "false",
        "closePayload": "node-red out",
        "closeMsg": {},
        "willTopic": "nodered-will",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": "nodered unplanned abort",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "c014efb4a23dbe6f",
        "type": "ui_group",
        "name": "temp and humi",
        "tab": "6c0499d7f0e978bb",
        "order": 1,
        "disp": true,
        "width": 20,
        "collapse": false,
        "className": ""
    },
    {
        "id": "305aba498b652f78",
        "type": "ui_group",
        "name": "PCA9557",
        "tab": "6c0499d7f0e978bb",
        "order": 3,
        "disp": true,
        "width": "9",
        "collapse": false,
        "className": ""
    },
    {
        "id": "6c0499d7f0e978bb",
        "type": "ui_tab",
        "name": "Elecrow for industry",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]
        "y": 380,
        "wires": []
    },
    {
        "id": "5496e5b6dbd2dd64",
        "type": "pca9557",
        "z": "296e2b77b8d592a4",
        "name": "",
        "pin": "0",
        "value": "1",
        "x": 1540,
        "y": 380,
        "wires": [
            []
        ],
        "icon": "node-red/rpi.svg"
    },
    {
        "id": "3a59e0f7c8aa23e8",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "d": true,
        "name": "",
        "label": "RS485 Send Enable",
        "tooltip": "",
        "group": "d82c0c4024caa8bb",
        "order": 3,
        "width": 0,
        "height": 0,
        "passthru": true,
        "decouple": "false",
        "topic": "topic",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 140,
        "y": 200,
        "wires": [
            [
                "d1cf74645d931c2a"
            ]
        ]
    },
    {
        "id": "d1cf74645d931c2a",
        "type": "rpi-gpio out",
        "z": "296e2b77b8d592a4",
        "name": "",
        "pin": "11",
        "set": true,
        "level": "0",
        "freq": "",
        "out": "out",
        "bcm": true,
        "x": 320,
        "y": 200,
        "wires": []
    },
    {
        "id": "26d3dc888473e7ac",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "RS485 control",
        "info": "",
        "x": 110,
        "y": 160,
        "wires": []
    },
    {
        "id": "df5794b8c0e40492",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "PCA9557 control ",
        "info": "",
        "x": 1260,
        "y": 280,
        "wires": []
    },
    {
        "id": "188a9706e4f022fc",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "user led",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 1,
        "width": 8,
        "height": 1,
        "passthru": true,
        "decouple": "false",
        "topic": "payload",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 1240,
        "y": 320,
        "wires": [
            [
                "0989cd0ce8703a4a"
            ]
        ]
    },
    {
        "id": "3137b177f52689b4",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "buzzer",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 3,
        "width": 8,
        "height": 1,
        "passthru": true,
        "decouple": "false",
        "topic": "buz",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 1230,
        "y": 380,
        "wires": [
            [
                "71bd0d75d54a8d9a"
            ]
        ]
    },
    {
        "id": "b09049a3266a85df",
        "type": "ui_switch",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "relay",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 5,
        "width": 8,
        "height": 1,
        "passthru": true,
        "decouple": "false",
        "topic": "rel",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 1230,
        "y": 440,
        "wires": [
            [
                "bc266d9df5cdbde2"
            ]
        ]
    },
    {
        "id": "0989cd0ce8703a4a",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "led_func",
        "func": "let outputmsgs = {};\noutputmsgs.pin = 1;\noutputmsgs.val = msg.payload ? 1 : 0;\nmsg.outputmsgs = outputmsgs;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1380,
        "y": 320,
        "wires": [
            [
                "5496e5b6dbd2dd64"
            ]
        ]
    },
    {
        "id": "71bd0d75d54a8d9a",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "buzzer_func",
        "func": "let outputmsgs = {};\noutputmsgs.pin = 0;\noutputmsgs.val = msg.payload ? 0 : 1;\nmsg.outputmsgs = outputmsgs;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1370,
        "y": 380,
        "wires": [
            [
                "5496e5b6dbd2dd64"
            ]
        ]
    },
    {
        "id": "bc266d9df5cdbde2",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "relay_func",
        "func": "let outputmsgs = {};\noutputmsgs.pin = 7;\noutputmsgs.val = msg.payload ? 1 : 0;\nmsg.outputmsgs = outputmsgs;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1370,
        "y": 440,
        "wires": [
            [
                "5496e5b6dbd2dd64"
            ]
        ]
    },
    {
        "id": "041e89b05047a272",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "MQTT receive HMI temo and humi data",
        "info": "",
        "x": 710,
        "y": 260,
        "wires": []
    },
    {
        "id": "2e21b235214e9837",
        "type": "comment",
        "z": "296e2b77b8d592a4",
        "name": "扫描iic设备地址",
        "info": "",
        "x": 120,
        "y": 40,
        "wires": []
    },
    {
        "id": "104349049b20fd8a",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "function 1",
        "func": "var temp = msg.payload;\nvar isWet = false;\nif (temp > 65) {\n    isWet = true;\n} else {\n    isWet = false;\n}\nmsg.payload = isWet;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 440,
        "wires": [
            [
                "b09049a3266a85df"
            ]
        ]
    },
    {
        "id": "e939bd5f6eb1760d",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "function 2",
        "func": "var temp = msg.payload;\nvar isHot = false;\nif (temp > 65) {\n    isHot = true;\n} else {\n    isHot = false;\n}\nmsg.payload = isHot;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 380,
        "wires": [
            [
                "3137b177f52689b4"
            ]
        ]
    },
    {
        "id": "0cd16018e9ac2ca1",
        "type": "function",
        "z": "296e2b77b8d592a4",
        "name": "function 3",
        "func": "var isValid = false;\n\nif (typeof msg.payload === 'number' && !isNaN(msg.payload)) {\n    isValid = true;\n}\nmsg.payload = isValid;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1080,
        "y": 320,
        "wires": [
            [
                "188a9706e4f022fc"
            ]
        ]
    },
    {
        "id": "1a80c677c7de4dce",
        "type": "ui_chart",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 3,
        "width": 10,
        "height": 6,
        "label": "humidityChart",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "0",
        "ymax": "100",
        "removeOlder": "2",
        "removeOlderPoints": "",
        "removeOlderUnit": "3600",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "outputs": 1,
        "useDifferentColor": false,
        "className": "",
        "x": 860,
        "y": 500,
        "wires": [
            []
        ]
    },
    {
        "id": "14c042f5ef232bee",
        "type": "ui_chart",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 4,
        "width": 10,
        "height": 6,
        "label": "temperatureChart",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": true,
        "ymin": "0",
        "ymax": "100",
        "removeOlder": "2",
        "removeOlderPoints": "",
        "removeOlderUnit": "3600",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "outputs": 1,
        "useDifferentColor": false,
        "className": "",
        "x": 870,
        "y": 340,
        "wires": [
            []
        ]
    },
    {
        "id": "e9126f3218b8a8b7",
        "type": "ui_gauge",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "c014efb4a23dbe6f",
        "order": 1,
        "width": 10,
        "height": 6,
        "gtype": "gage",
        "title": "Humi",
        "label": "%",
        "format": "{{value}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "50",
        "seg2": "60",
        "diff": false,
        "className": "",
        "x": 830,
        "y": 540,
        "wires": []
    },
    {
        "id": "25f46aa08259ec52",
        "type": "ui_slider",
        "z": "296e2b77b8d592a4",
        "name": "",
        "label": "temp controler",
        "tooltip": "",
        "group": "305aba498b652f78",
        "order": 7,
        "width": 6,
        "height": 1,
        "passthru": true,
        "outs": "all",
        "topic": "topic",
        "topicType": "msg",
        "min": 0,
        "max": "30",
        "step": 1,
        "className": "",
        "x": 1220,
        "y": 520,
        "wires": [
            [
                "c918a83333fb4940"
            ]
        ]
    },
    {
        "id": "c918a83333fb4940",
        "type": "ui_gauge",
        "z": "296e2b77b8d592a4",
        "name": "",
        "group": "305aba498b652f78",
        "order": 8,
        "width": 5,
        "height": 5,
        "gtype": "donut",
        "title": "temp controler info",
        "label": "units",
        "format": "{{value}}",
        "min": 0,
        "max": "30",
        "colors": [
            "#00b500",
            "#0058e6",
            "#ca3838"
        ],
        "seg1": "16",
        "seg2": "26",
        "diff": false,
        "className": "",
        "x": 1410,
        "y": 520,
        "wires": []
    },
    {
        "id": "9a54579b3808f531",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 1,
        "width": 1,
        "height": 1
    },
    {
        "id": "bdd726f46e44ddbd",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 3,
        "width": 2,
        "height": 1
    },
    {
        "id": "097a0ebc80c7d4cd",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 4,
        "width": 1,
        "height": 1
    },
    {
        "id": "6d5425bbc2ca3232",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 5,
        "width": 2,
        "height": 1
    },
    {
        "id": "ae38f0e15b5a1ddb",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 6,
        "width": 1,
        "height": 1
    },
    {
        "id": "65cd654e7f67f096",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 7,
        "width": 2,
        "height": 1
    },
    {
        "id": "bcfd0798aa4b16ef",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 8,
        "width": 1,
        "height": 1
    },
    {
        "id": "64b1cc3aea755c98",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 9,
        "width": 2,
        "height": 1
    },
    {
        "id": "0d20f3b73ddb4758",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 10,
        "width": 1,
        "height": 1
    },
    {
        "id": "1d38b98ef1126178",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 11,
        "width": 2,
        "height": 1
    },
    {
        "id": "216d9a1fb8258924",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 12,
        "width": 1,
        "height": 1
    },
    {
        "id": "d3219b425bd00599",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "eea09010a27bf209",
        "order": 13,
        "width": 2,
        "height": 1
    },
    {
        "id": "d7c9dfa7e24b4cff",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "305aba498b652f78",
        "order": 2,
        "width": 1,
        "height": 1
    },
    {
        "id": "4c000b5e0ffd18d8",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "305aba498b652f78",
        "order": 4,
        "width": 1,
        "height": 1
    },
    {
        "id": "0c497df34323570e",
        "type": "ui_spacer",
        "z": "296e2b77b8d592a4",
        "name": "spacer",
        "group": "305aba498b652f78",
        "order": 6,
        "width": 1,
        "height": 1
    },
    {
        "id": "5f3c9c64d34d1690",
        "type": "serial-port",
        "name": "",
        "serialport": "/dev/ttyAMA2",
        "serialbaud": "9600",
        "databits": "8",
        "parity": "none",
        "stopbits": "1",
        "waitfor": "",
        "dtr": "none",
        "rts": "none",
        "cts": "none",
        "dsr": "none",
        "newline": "\\n",
        "bin": "false",
        "out": "char",
        "addchar": "\\n",
        "responsetimeout": "10000"
    },
    {
        "id": "d82c0c4024caa8bb",
        "type": "ui_group",
        "name": "Serial",
        "tab": "6c0499d7f0e978bb",
        "order": 4,
        "disp": true,
        "width": 15,
        "collapse": true,
        "className": ""
    },
    {
        "id": "eea09010a27bf209",
        "type": "ui_group",
        "d": true,
        "name": "camera",
        "tab": "6c0499d7f0e978bb",
        "order": 2,
        "disp": true,
        "width": "12",
        "collapse": false,
        "className": ""
    },
    {
        "id": "6193b9767af23365",
        "type": "mqtt-broker",
        "name": "",
        "broker": "127.0.0.1",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "nodered-in",
        "birthQos": "1",
        "birthRetain": "false",
        "birthPayload": "node-red in",
        "birthMsg": {},
        "closeTopic": "nodered-out",
        "closeQos": "1",
        "closeRetain": "false",
        "closePayload": "node-red out",
        "closeMsg": {},
        "willTopic": "nodered-will",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": "nodered unplanned abort",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "c014efb4a23dbe6f",
        "type": "ui_group",
        "name": "温湿度",
        "tab": "6c0499d7f0e978bb",
        "order": 1,
        "disp": true,
        "width": 20,
        "collapse": false,
        "className": ""
    },
    {
        "id": "305aba498b652f78",
        "type": "ui_group",
        "name": "PCA9557",
        "tab": "6c0499d7f0e978bb",
        "order": 3,
        "disp": true,
        "width": "9",
        "collapse": false,
        "className": ""
    },
    {
        "id": "6c0499d7f0e978bb",
        "type": "ui_tab",
        "name": "Elecrow for industry",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]