[
    {
        "id": "f148442936b960a9",
        "type": "tab",
        "label": "网络云台视频监控",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "d78cdc041f337cc6",
        "type": "http in",
        "z": "f148442936b960a9",
        "name": "IP:1880/NetCamera",
        "url": "/NetCamera",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 170,
        "y": 140,
        "wires": [
            [
                "730fe598432ac6d6"
            ]
        ]
    },
    {
        "id": "bb17efd6fa675497",
        "type": "http response",
        "z": "f148442936b960a9",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 710,
        "y": 140,
        "wires": []
    },
    {
        "id": "730fe598432ac6d6",
        "type": "template",
        "z": "f148442936b960a9",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "<!DOCTYPE html>\n\n<html>\n<head>\n<title>云台摄像头服务器</title>\n</head>\n<body>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Title</title>\n</head>\n\n<body>\n\n    <div style=\"width: 80%; margin: 0 auto;\">\n        <!--    <button id=\"begin\">开始</button>-->\n        <button id=\"record\" disabled>录制</button>\n        <!--    <button id=\"play\" disabled>播放</button>-->\n        <button id=\"download\" disabled>下载</button>\n        <button id=\"reStart\" disabled>重新开始</button>\n        <!--    <button id=\"upload\">上传</button>-->\n    </div>\n    <video id=\"gum\" , controls preload=\"none\" width=\"100%\" height=\"100%\" data-setup=\"{}\" autoplay=\"autoplay\"></video>\n    <p id=\"status\" , style=\"text-align: center;width: 402px;\"></p>\n    <script>\n        var mediaSource = new MediaSource();  //打开电脑摄像头\n    // mediaSource.addEventListener('sourceopen', handleSourceOpen, false);\n    var mediaRecorder ;\n    var recordedBlobs;\n    var sourceBuffer;\n    var littleVideo = false;\n\n    var gumVideo = document.querySelector(\"#gum\");  //把图像显示在video上\n    var statusV = document.getElementById(\"status\"); //显示状态信息\n    // var recordedVideo = document.querySelector(\"video#recorded\");\n    // statusV.innerText = '准备阶段';\n\n    // var beginButton = document.querySelector(\"button#begin\");\n    var recordButton = document.querySelector(\"button#record\");\n    var playButton = document.querySelector(\"button#play\");\n    var downloadButton = document.querySelector(\"button#download\");\n    var reStartButton = document.querySelector(\"button#reStart\");\n    var uploadBtn = document.querySelector(\"button#upload\");\n\n\n    recordButton.onclick = toggleRecording;\n    // playButton.onclick = play;\n    downloadButton.onclick = download;\n    reStartButton.onclick = restartRecord;\n\n\n\n    var constraints = {\n        audio: true,\n        video: true\n    };\n\n\n    function handleSuccess(stream) {\n        recordButton.disabled = false;\n        console.log(\"getUserMedia() got stream: \", stream);\n        window.stream = stream;\n        if (window.URL) {\n            //gumVideo.src = window.URL.createObjectURL(stream);\n            gumVideo.srcObject = stream;\n        } else {\n            gumVideo.src = stream;\n        }\n\n\n\n        gumVideo.addEventListener('pause',function() {if(i){window.clearInterval(i);}},false);\n        gumVideo.addEventListener('ended',function() {if(i){clearInterval(i);}},false);\n    }\n\n    // function handleError(error) {\n    //     console.log(\"navigator.getUserMedia error: \", error);\n    // }\n\n    navigator.mediaDevices.getUserMedia(constraints).  //打开摄像头\n    then(handleSuccess).catch(handleError);\n\n    // function handleSourceOpen(event) {\n    //     console.log(\"MediaSource opened\");\n    //     sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs=\"vp8\"');\n    //     console.log(\"Source buffer: \", sourceBuffer);\n    // }\n\n    // recordedVideo.addEventListener('error', function(ev) {\n    //     console.error('MediaRecording.recordedMedia.error()');\n    //     alert('Your browser can not play\\n\\n' + recordedVideo.src\n    //         + '\\n\\n media clip. event: ' + JSON.stringify(ev));\n    // }, true);\n\n    function handleDataAvailable(event) {\n        if (event.data && event.data.size > 0) {\n            recordedBlobs.push(event.data);\n        }\n    }\n\n    function handleStop(event) {\n        console.log(\"Recorder stopped: \", event);\n    }\n\n    function toggleRecording() {\n        if (recordButton.textContent === '录制' || recordButton.textContent === '重录') {\n            littleVideo = false;\n            startRecording();\n        } else {\n            stopRecording();\n            recordButton.textContent = '重录';\n            // playButton.disabled = false;\n            downloadButton.disabled = false;\n            reStartButton.disabled = false;\n        }\n    }\n\n    function startRecording() {\n        statusV.innerText = '开始录制';\n        //todo：显示录制中 提示\n        recordedBlobs = [];\n        var options = {mimeType: 'video/webm;codecs=vp9'};\n        if (!MediaRecorder.isTypeSupported(options.mimeType)) {\n            console.log(options.mimeType + ' is not Supported');\n            options = {mimeType: 'video/webm;codecs=vp8'};\n            if (!MediaRecorder.isTypeSupported(options.mimeType)) {\n                console.log(options.mimeType + ' is not Supported');\n                options = {mimeType: 'video/webm'};\n                if (!MediaRecorder.isTypeSupported(options.mimeType)) {\n                    console.log(options.mimeType + ' is not Supported');\n                    options = {mimeType: ''};\n                }\n            }\n        }\n        try {\n            mediaRecorder = new MediaRecorder(window.stream, options);\n        } catch (e) {\n            console.error('Exception while creating MediaRecorder: ' + e);\n            alert('Exception while creating MediaRecorder: '\n                + e + '. mimeType: ' + options.mimeType);\n            return;\n        }\n        // console.log('Created MediaRecorder', mediaRecorder, 'with options', options);\n        recordButton.textContent = '停止';\n        // playButton.disabled = true;\n        downloadButton.disabled = true;\n        reStartButton.disabled = true;\n        mediaRecorder.onstop = handleStop;\n        mediaRecorder.ondataavailable = handleDataAvailable;\n        mediaRecorder.start(10); // collect 10ms of data\n        // console.log('MediaRecorder started', mediaRecorder);\n    }\n\n    function stopRecording() {\n        statusV.innerText = '停止录像';\n        //影藏录制中提\n        mediaRecorder.stop();\n        console.log('Recorded Blobs: ', recordedBlobs);\n        //recordedVideo.controls = true;\n    }\n\n    // function play() {\n    //     var superBuffer = new Blob(recordedBlobs, {type: 'video/mp4'});\n    //     //recordedVideo.src = window.URL.createObjectURL(superBuffer);\n    //     gumVideo.src = window.URL.createObjectURL(superBuffer);\n    // }\n\n    function download() {\n        var blob = new Blob(recordedBlobs, {type: 'video/mp4'});\n        var url = window.URL.createObjectURL(blob);\n        var a = document.createElement('a');\n        a.style.display = 'none';\n        a.href = url;\n        //文件名 通过方法传进来 检测是否合法？\n        a.download = '视频录像.mp4';\n        document.body.appendChild(a);\n        a.click();\n        setTimeout(function() {\n            document.body.removeChild(a);\n            window.URL.revokeObjectURL(url);\n        }, 100);\n    }\n\n\n    function upload(){\n        formData.append('nickName','Jack');//-->后台用req.body.nickName将值'Jack'取出\n        var blob = new Blob(recordedBlobs, {type: 'video/mp4'});\n        // var data = new FormData();\n        var data = new FormData();\n        data.append('file', file);\n        return uploadVideoFile(data).then(res => {\n            return this.recordVideoUrl = res.url;//获取上传的视频地址\n        })\n        // data.append('video', blob);\n        // data.append('qw', 123);\n        // data.append('question', 1);\n        // var formData = new FormData();\n        //\n        // formData.append(\"username\", \"Groucho\");\n        // formData.append(\"accountnum\", 123456); // 数字 123456 会被立即转换成字符串 \"123456\"\n        //\n        // // JavaScript file-like 对象\n        // var content = '<a id=\"a\"><b id=\"b\">hey!</b></a>';\n        // var blob = new Blob([content], { type: \"text/xml\"});\n        //\n        // formData.append(\"webmasterfile\", blob);\n        //\n        // console.log(formData);\n\n        $.ajax({\n            type: \"POST\",\n            url: \"/form/data\",\n            data: data,\n            processData:false,   //  告诉jquery不要处理发送的数据\n            contentType:false,    // 告诉jquery不要设置content-Type请求头\n            success:function(msg){\n                console.log(msg);\n            }\n        });\n    }\n\n    function restartRecord(){\n        //清楚存留 按钮功能重置\n        recordButton.textContent = '录制';\n        playButton.disabled = true;\n        downloadButton.disabled = true;\n        reStartButton.disabled = true;\n        //handleSuccess();\n        navigator.mediaDevices.getUserMedia(constraints).\n        then(handleSuccess).catch(handleError);\n        // statusV.innerText = '准备阶段';\n    }\n    </script>\n</body>\n\n</html>",
        "output": "str",
        "x": 490,
        "y": 140,
        "wires": [
            [
                "bb17efd6fa675497"
            ]
        ]
    },
    {
        "id": "22c9a28f362f4e53",
        "type": "exec",
        "z": "f148442936b960a9",
        "command": "poweroff",
        "addpay": "",
        "append": "",
        "useSpawn": "false",
        "timer": "",
        "winHide": false,
        "oldrc": false,
        "name": "",
        "x": 720,
        "y": 180,
        "wires": [
            [],
            [],
            []
        ]
    },
    {
        "id": "3705a452b24325fa",
        "type": "exec",
        "z": "f148442936b960a9",
        "command": "sudo  ./pwm_camera 2 1000000",
        "addpay": "payload",
        "append": "",
        "useSpawn": "false",
        "timer": "",
        "winHide": false,
        "oldrc": false,
        "name": "",
        "x": 790,
        "y": 240,
        "wires": [
            [
                "eabd6828fb1c1b79"
            ],
            [
                "eabd6828fb1c1b79"
            ],
            [
                "eabd6828fb1c1b79"
            ]
        ]
    },
    {
        "id": "eabd6828fb1c1b79",
        "type": "debug",
        "z": "f148442936b960a9",
        "name": "debug 9",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 980,
        "y": 160,
        "wires": []
    },
    {
        "id": "abc9283427822b0a",
        "type": "function",
        "z": "f148442936b960a9",
        "name": "msg.payload.params.turn_control",
        "func": "var temp = msg.payload.params.turn_control;\nif(temp>650000)temp=650000;\nmsg.payload = temp;\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 480,
        "y": 300,
        "wires": [
            [
                "3705a452b24325fa"
            ]
        ]
    },
    {
        "id": "7a4c95fdf6ba9ac9",
        "type": "iot-mqtt-subscribe",
        "z": "f148442936b960a9",
        "name": "Tencent IoT Subscribe",
        "mqttBroker": "b851f17eb96ed816",
        "topic": "$thing/down/property/8IT0644V94/SmartCar_Controler",
        "x": 180,
        "y": 300,
        "wires": [
            [
                "abc9283427822b0a"
            ]
        ]
    },
    {
        "id": "4c38e3b3d08eb991",
        "type": "iot-mqtt-publish",
        "z": "f148442936b960a9",
        "name": "Tencent IoT Publish",
        "mqttBroker": "b851f17eb96ed816",
        "topic": "$thing/up/property/8IT0644V94/SmartCar_Controler",
        "x": 190,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "8f408ae15af9833b",
        "type": "ui_button",
        "z": "f148442936b960a9",
        "name": "关机",
        "group": "243fdda4bf247468",
        "order": 31,
        "width": 5,
        "height": 2,
        "passthru": false,
        "label": "关机",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "300000",
        "payloadType": "num",
        "topic": "topic",
        "topicType": "msg",
        "x": 450,
        "y": 180,
        "wires": [
            [
                "22c9a28f362f4e53"
            ]
        ]
    },
    {
        "id": "609c1c9360d94b1d",
        "type": "ui_slider",
        "z": "f148442936b960a9",
        "name": "",
        "label": "摄像头转向控制",
        "tooltip": "",
        "group": "243fdda4bf247468",
        "order": 33,
        "width": 0,
        "height": 0,
        "passthru": true,
        "outs": "all",
        "topic": "topic",
        "topicType": "msg",
        "min": 0,
        "max": "650000",
        "step": "10",
        "x": 480,
        "y": 240,
        "wires": [
            [
                "3705a452b24325fa"
            ]
        ]
    },
    {
        "id": "548b61cc934a383d",
        "type": "ui_template",
        "z": "f148442936b960a9",
        "group": "243fdda4bf247468",
        "name": "网页摄像头",
        "order": 14,
        "width": "19",
        "height": "11",
        "format": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Title</title>\n</head>\n\n<body>\n\n    <div style=\"width: 80%; margin: 0 auto;\">\n        <!--    <button id=\"begin\">开始</button>-->\n        <button id=\"record\" disabled>录制</button>\n        <!--    <button id=\"play\" disabled>播放</button>-->\n        <button id=\"download\" disabled>下载</button>\n        <button id=\"reStart\" disabled>重新开始</button>\n        <!--    <button id=\"upload\">上传</button>-->\n    </div>\n    <video id=\"gum\" , controls preload=\"none\" width=\"100%\" height=\"100%\" data-setup=\"{}\" autoplay=\"autoplay\"></video>\n    <p id=\"status\" , style=\"text-align: center;width: 402px;\"></p>\n    <script>\n        var mediaSource = new MediaSource();  //打开电脑摄像头\n    // mediaSource.addEventListener('sourceopen', handleSourceOpen, false);\n    var mediaRecorder ;\n    var recordedBlobs;\n    var sourceBuffer;\n    var littleVideo = false;\n\n    var gumVideo = document.querySelector(\"#gum\");  //把图像显示在video上\n    var statusV = document.getElementById(\"status\"); //显示状态信息\n    // var recordedVideo = document.querySelector(\"video#recorded\");\n    // statusV.innerText = '准备阶段';\n\n    // var beginButton = document.querySelector(\"button#begin\");\n    var recordButton = document.querySelector(\"button#record\");\n    var playButton = document.querySelector(\"button#play\");\n    var downloadButton = document.querySelector(\"button#download\");\n    var reStartButton = document.querySelector(\"button#reStart\");\n    var uploadBtn = document.querySelector(\"button#upload\");\n\n\n    recordButton.onclick = toggleRecording;\n    // playButton.onclick = play;\n    downloadButton.onclick = download;\n    reStartButton.onclick = restartRecord;\n\n\n\n    var constraints = {\n        audio: true,\n        video: true\n    };\n\n\n    function handleSuccess(stream) {\n        recordButton.disabled = false;\n        console.log(\"getUserMedia() got stream: \", stream);\n        window.stream = stream;\n        if (window.URL) {\n            //gumVideo.src = window.URL.createObjectURL(stream);\n            gumVideo.srcObject = stream;\n        } else {\n            gumVideo.src = stream;\n        }\n\n\n\n        gumVideo.addEventListener('pause',function() {if(i){window.clearInterval(i);}},false);\n        gumVideo.addEventListener('ended',function() {if(i){clearInterval(i);}},false);\n    }\n\n    // function handleError(error) {\n    //     console.log(\"navigator.getUserMedia error: \", error);\n    // }\n\n    navigator.mediaDevices.getUserMedia(constraints).  //打开摄像头\n    then(handleSuccess).catch(handleError);\n\n    // function handleSourceOpen(event) {\n    //     console.log(\"MediaSource opened\");\n    //     sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs=\"vp8\"');\n    //     console.log(\"Source buffer: \", sourceBuffer);\n    // }\n\n    // recordedVideo.addEventListener('error', function(ev) {\n    //     console.error('MediaRecording.recordedMedia.error()');\n    //     alert('Your browser can not play\\n\\n' + recordedVideo.src\n    //         + '\\n\\n media clip. event: ' + JSON.stringify(ev));\n    // }, true);\n\n    function handleDataAvailable(event) {\n        if (event.data && event.data.size > 0) {\n            recordedBlobs.push(event.data);\n        }\n    }\n\n    function handleStop(event) {\n        console.log(\"Recorder stopped: \", event);\n    }\n\n    function toggleRecording() {\n        if (recordButton.textContent === '录制' || recordButton.textContent === '重录') {\n            littleVideo = false;\n            startRecording();\n        } else {\n            stopRecording();\n            recordButton.textContent = '重录';\n            // playButton.disabled = false;\n            downloadButton.disabled = false;\n            reStartButton.disabled = false;\n        }\n    }\n\n    function startRecording() {\n        statusV.innerText = '开始录制';\n        //todo：显示录制中 提示\n        recordedBlobs = [];\n        var options = {mimeType: 'video/webm;codecs=vp9'};\n        if (!MediaRecorder.isTypeSupported(options.mimeType)) {\n            console.log(options.mimeType + ' is not Supported');\n            options = {mimeType: 'video/webm;codecs=vp8'};\n            if (!MediaRecorder.isTypeSupported(options.mimeType)) {\n                console.log(options.mimeType + ' is not Supported');\n                options = {mimeType: 'video/webm'};\n                if (!MediaRecorder.isTypeSupported(options.mimeType)) {\n                    console.log(options.mimeType + ' is not Supported');\n                    options = {mimeType: ''};\n                }\n            }\n        }\n        try {\n            mediaRecorder = new MediaRecorder(window.stream, options);\n        } catch (e) {\n            console.error('Exception while creating MediaRecorder: ' + e);\n            alert('Exception while creating MediaRecorder: '\n                + e + '. mimeType: ' + options.mimeType);\n            return;\n        }\n        // console.log('Created MediaRecorder', mediaRecorder, 'with options', options);\n        recordButton.textContent = '停止';\n        // playButton.disabled = true;\n        downloadButton.disabled = true;\n        reStartButton.disabled = true;\n        mediaRecorder.onstop = handleStop;\n        mediaRecorder.ondataavailable = handleDataAvailable;\n        mediaRecorder.start(10); // collect 10ms of data\n        // console.log('MediaRecorder started', mediaRecorder);\n    }\n\n    function stopRecording() {\n        statusV.innerText = '停止录像';\n        //影藏录制中提\n        mediaRecorder.stop();\n        console.log('Recorded Blobs: ', recordedBlobs);\n        //recordedVideo.controls = true;\n    }\n\n    // function play() {\n    //     var superBuffer = new Blob(recordedBlobs, {type: 'video/mp4'});\n    //     //recordedVideo.src = window.URL.createObjectURL(superBuffer);\n    //     gumVideo.src = window.URL.createObjectURL(superBuffer);\n    // }\n\n    function download() {\n        var blob = new Blob(recordedBlobs, {type: 'video/mp4'});\n        var url = window.URL.createObjectURL(blob);\n        var a = document.createElement('a');\n        a.style.display = 'none';\n        a.href = url;\n        //文件名 通过方法传进来 检测是否合法？\n        a.download = '视频录像.mp4';\n        document.body.appendChild(a);\n        a.click();\n        setTimeout(function() {\n            document.body.removeChild(a);\n            window.URL.revokeObjectURL(url);\n        }, 100);\n    }\n\n\n    function upload(){\n        formData.append('nickName','Jack');//-->后台用req.body.nickName将值'Jack'取出\n        var blob = new Blob(recordedBlobs, {type: 'video/mp4'});\n        // var data = new FormData();\n        var data = new FormData();\n        data.append('file', file);\n        return uploadVideoFile(data).then(res => {\n            return this.recordVideoUrl = res.url;//获取上传的视频地址\n        })\n        // data.append('video', blob);\n        // data.append('qw', 123);\n        // data.append('question', 1);\n        // var formData = new FormData();\n        //\n        // formData.append(\"username\", \"Groucho\");\n        // formData.append(\"accountnum\", 123456); // 数字 123456 会被立即转换成字符串 \"123456\"\n        //\n        // // JavaScript file-like 对象\n        // var content = '<a id=\"a\"><b id=\"b\">hey!</b></a>';\n        // var blob = new Blob([content], { type: \"text/xml\"});\n        //\n        // formData.append(\"webmasterfile\", blob);\n        //\n        // console.log(formData);\n\n        $.ajax({\n            type: \"POST\",\n            url: \"/form/data\",\n            data: data,\n            processData:false,   //  告诉jquery不要处理发送的数据\n            contentType:false,    // 告诉jquery不要设置content-Type请求头\n            success:function(msg){\n                console.log(msg);\n            }\n        });\n    }\n\n    function restartRecord(){\n        //清楚存留 按钮功能重置\n        recordButton.textContent = '录制';\n        playButton.disabled = true;\n        downloadButton.disabled = true;\n        reStartButton.disabled = true;\n        //handleSuccess();\n        navigator.mediaDevices.getUserMedia(constraints).\n        then(handleSuccess).catch(handleError);\n        // statusV.innerText = '准备阶段';\n    }\n    </script>\n</body>\n\n</html>",
        "storeOutMessages": true,
        "fwdInMessages": true,
        "resendOnRefresh": true,
        "templateScope": "local",
        "x": 190,
        "y": 180,
        "wires": [
            []
        ]
    },
    {
        "id": "6372e0fc462a3b09",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 2,
        "width": 9,
        "height": 1
    },
    {
        "id": "3daa96083c7781e8",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 3,
        "width": 9,
        "height": 1
    },
    {
        "id": "35dce6b3bf780a0a",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 4,
        "width": 9,
        "height": 1
    },
    {
        "id": "1e9e5718c9bbb858",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 5,
        "width": 9,
        "height": 1
    },
    {
        "id": "671d6d2685caa1c1",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 6,
        "width": 9,
        "height": 1
    },
    {
        "id": "8d749bbc94414399",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 7,
        "width": 9,
        "height": 1
    },
    {
        "id": "784326584d482365",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 8,
        "width": 9,
        "height": 1
    },
    {
        "id": "a5b30a2bed257de6",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 9,
        "width": 9,
        "height": 1
    },
    {
        "id": "aba35252088887c0",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 10,
        "width": 9,
        "height": 1
    },
    {
        "id": "fa8b56c5821587bf",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 11,
        "width": 9,
        "height": 1
    },
    {
        "id": "dc50251863f228e9",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 12,
        "width": 24,
        "height": 1
    },
    {
        "id": "1f4455744b18b629",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 13,
        "width": 24,
        "height": 1
    },
    {
        "id": "e4c3d1dfdad9613e",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 15,
        "width": 10,
        "height": 1
    },
    {
        "id": "3b63acaa04451db2",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 16,
        "width": 10,
        "height": 1
    },
    {
        "id": "bba03e687b01fab0",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 17,
        "width": 10,
        "height": 1
    },
    {
        "id": "d78a99646944168c",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 18,
        "width": 10,
        "height": 1
    },
    {
        "id": "8c4446fb24973174",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 19,
        "width": 10,
        "height": 1
    },
    {
        "id": "dde949a53fdd8cfb",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 20,
        "width": 10,
        "height": 1
    },
    {
        "id": "4e26c182d71491f5",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 21,
        "width": 24,
        "height": 1
    },
    {
        "id": "0a4fd259cfdd3eac",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 22,
        "width": 24,
        "height": 1
    },
    {
        "id": "4bc1d5a82542d23e",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 23,
        "width": 24,
        "height": 1
    },
    {
        "id": "c9dd0a7fb0285190",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 24,
        "width": 24,
        "height": 1
    },
    {
        "id": "af7dba05e72322b7",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 25,
        "width": 24,
        "height": 1
    },
    {
        "id": "5fcc8478a0e1bcd9",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 26,
        "width": 24,
        "height": 1
    },
    {
        "id": "9362fd89d823d2dd",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 27,
        "width": 24,
        "height": 1
    },
    {
        "id": "b72d2a5f4dcd75d3",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 28,
        "width": 24,
        "height": 1
    },
    {
        "id": "072a8de9dc39e207",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 29,
        "width": 24,
        "height": 1
    },
    {
        "id": "86b33581cdf64773",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 32,
        "width": 14,
        "height": 1
    },
    {
        "id": "18f741c696603424",
        "type": "ui_spacer",
        "z": "f148442936b960a9",
        "name": "spacer",
        "group": "da5d7a5df68290b8",
        "order": 33,
        "width": 14,
        "height": 1
    },
    {
        "id": "b851f17eb96ed816",
        "type": "Tencent IoT MQTT Broker",
        "productId": "8IT0644V94",
        "deviceName": "SmartCar_Controler",
        "deviceSecret": "k3gzdfIibFQPpm/urywLTg=="
    },
    {
        "id": "243fdda4bf247468",
        "type": "ui_group",
        "name": "鲁班猫云台摄像头",
        "tab": "e539a52765d82077",
        "order": 1,
        "disp": true,
        "width": 22,
        "collapse": false
    },
    {
        "id": "da5d7a5df68290b8",
        "type": "ui_group",
        "name": "摄像头",
        "tab": "f202613d0e6b6456",
        "order": 1,
        "disp": true,
        "width": "24",
        "collapse": false
    },
    {
        "id": "e539a52765d82077",
        "type": "ui_tab",
        "name": "lubancat1.0Camera",
        "icon": "dashboard",
        "order": 1,
        "disabled": false,
        "hidden": false
    },
    {
        "id": "f202613d0e6b6456",
        "type": "ui_tab",
        "name": "监控摄像",
        "icon": "dashboard",
        "order": 2,
        "disabled": false,
        "hidden": false
    }
]