Mihai Popa
Published © MIT

ZigMonitor

ZigMonitor - an device that will collect environmental data and will send them to Smart House build with NodeRed

AdvancedWork in progress1 hour1,061
ZigMonitor

Things used in this project

Hardware components

DFRobot Beetle ESP32-C6
×1
DFRobot Fermion: 2.8” 320x240 TFT LCD
×1

Software apps and online services

NextPCB - Reliable Multilayer PCB Manufacturing and Assembly
Arduino IDE
Arduino IDE
KiCad
KiCad
Tinkercad
Autodesk Tinkercad

Story

Read more

Custom parts and enclosures

ZigMonitor case .obj

ZigMonitor case .stl

Sketchfab still processing.

Schematics

Schematic, PCB and fabrication files in KiCad

ZigMonitor schematic

Code

ZigMonitor code

C/C++
Arduino code used for this project; the attached archive contain all necessary files for this.
No preview (download only).

NodeRed settings

JSON
Implementation of NodeRed UI. nodes and function to receice, calculate and sisplay data from ZigMonitor
[
    {
        "id": "b8293252ace58d54",
        "type": "tab",
        "label": "ZigMonitor",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "15a0b7628aa927ad",
        "type": "mqtt in",
        "z": "b8293252ace58d54",
        "name": "",
        "topic": "zigbee2mqtt/ZigMonitor",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "590e3ceaadf4028f",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 150,
        "y": 120,
        "wires": [
            [
                "7c7d01eac1f1dbb2",
                "7144def3c2d5583c",
                "88cfd88a97187bb5",
                "5cc699693a880090"
            ]
        ]
    },
    {
        "id": "1eb0465da9e41745",
        "type": "ui_gauge",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "205d7ba8bf91bdd2",
        "order": 1,
        "width": 6,
        "height": 3,
        "gtype": "gage",
        "title": "Temperature",
        "label": "Celsius",
        "format": "{{value}}",
        "min": 0,
        "max": "50",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "diff": false,
        "className": "",
        "x": 880,
        "y": 380,
        "wires": []
    },
    {
        "id": "7c7d01eac1f1dbb2",
        "type": "function",
        "z": "b8293252ace58d54",
        "name": "Read data from ZigMonitor",
        "func": "//Extract data from received message\nlet battery           = msg.payload.battery;\nlet co2_12            = msg.payload.co2_12;\nlet humidity          = msg.payload.humidity;\nlet illuminance_9     = msg.payload.illuminance_9;\nlet illuminance_lux_9 = msg.payload.illuminance_lux_9;\nlet linkquality       = msg.payload.linkquality;\nlet pressure_11       = msg.payload.pressure_11;\nlet temperature       = msg.payload.temperature;\n\n//Create separate messages for temperature, humi, co2, press and linkquality:\nlet msgTemp        = {payload: temperature };\nlet msgLinkquality = {payload: linkquality};\nlet msgHumi        = {payload: humidity};\nlet msgBat         = {payload: battery};\nlet msgCO2         = {payload: co2_12};\nlet msgIllum       = {payload: illuminance_9};\nlet msgPress       = {payload: pressure_11};\nlet msgIllum_lux   = {payload: illuminance_lux_9};\n\n\n//Return an array with both messages:\nreturn [msgBat, msgCO2, msgHumi, msgIllum, msgIllum_lux, msgLinkquality, msgPress, msgTemp];",
        "outputs": 8,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 510,
        "y": 120,
        "wires": [
            [
                "d02864f1b8ac02ed"
            ],
            [],
            [
                "2dd2d96654f32c4b",
                "7b4764e2d90dbac6"
            ],
            [
                "f1675666cbab47ad"
            ],
            [],
            [
                "2101540ecc0606f0"
            ],
            [
                "d9b526d890404cc3"
            ],
            [
                "1eb0465da9e41745",
                "0430ce41872fa718"
            ]
        ]
    },
    {
        "id": "0430ce41872fa718",
        "type": "ui_chart",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "205d7ba8bf91bdd2",
        "order": 2,
        "width": 6,
        "height": 3,
        "label": "Temperature",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "0",
        "ymax": "50",
        "removeOlder": 1,
        "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": 880,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "2dd2d96654f32c4b",
        "type": "ui_gauge",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "205d7ba8bf91bdd2",
        "order": 3,
        "width": 6,
        "height": 3,
        "gtype": "gage",
        "title": "Humidity",
        "label": "%Rh",
        "format": "{{value}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#d8220e",
            "#e6e600",
            "#43cb3a"
        ],
        "seg1": "",
        "seg2": "",
        "diff": false,
        "className": "",
        "x": 860,
        "y": 120,
        "wires": []
    },
    {
        "id": "7b4764e2d90dbac6",
        "type": "ui_chart",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "205d7ba8bf91bdd2",
        "order": 4,
        "width": 6,
        "height": 3,
        "label": "Humidity",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": 1,
        "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": 160,
        "wires": [
            []
        ]
    },
    {
        "id": "d02864f1b8ac02ed",
        "type": "ui_text",
        "z": "b8293252ace58d54",
        "group": "205d7ba8bf91bdd2",
        "order": 7,
        "width": 3,
        "height": 1,
        "name": "",
        "label": "Battery %:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 870,
        "y": 80,
        "wires": []
    },
    {
        "id": "2101540ecc0606f0",
        "type": "ui_text",
        "z": "b8293252ace58d54",
        "group": "205d7ba8bf91bdd2",
        "order": 9,
        "width": 4,
        "height": 1,
        "name": "",
        "label": "Link quality %:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 880,
        "y": 280,
        "wires": []
    },
    {
        "id": "d9b526d890404cc3",
        "type": "ui_gauge",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "205d7ba8bf91bdd2",
        "order": 5,
        "width": 6,
        "height": 3,
        "gtype": "gage",
        "title": "Atm pressure",
        "label": "hPa",
        "format": "{{value}}",
        "min": "700",
        "max": "1200",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "diff": false,
        "className": "",
        "x": 880,
        "y": 340,
        "wires": []
    },
    {
        "id": "f1675666cbab47ad",
        "type": "ui_gauge",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "205d7ba8bf91bdd2",
        "order": 6,
        "width": 6,
        "height": 3,
        "gtype": "gage",
        "title": "Illumination",
        "label": "lux",
        "format": "{{value}}",
        "min": 0,
        "max": "10000",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "diff": false,
        "className": "",
        "x": 870,
        "y": 200,
        "wires": []
    },
    {
        "id": "7144def3c2d5583c",
        "type": "function",
        "z": "b8293252ace58d54",
        "name": "Calculate DEW point and ITU",
        "func": "let T  = Number(msg.payload.temperature);\nlet RH = Number(msg.payload.humidity);\n\nif (isNaN(T)) {\n    node.error(\"Temperatura invalid: \" + msg.payload.temperature);\n    return null;\n}\nif (isNaN(RH) || RH <= 0 || RH > 100) {\n    node.error(\"Umiditate invalid: \" + msg.payload.humidity);\n    return null;\n}\n\n// Magnus formula\nlet a = 17.27;\nlet b = 237.7;\nlet alpha = ((a * T) / (b + T)) + Math.log(RH / 100);\nlet dewPoint = (b * alpha) / (a - alpha);\n\nif (isNaN(dewPoint)) {\n    node.error(\"Eroare: dewPoint este NaN\");\n    node.warn(`T=${T}, RH=${RH}, alpha=${alpha}`);\n    return null;\n}\n\n// Heat Index\nlet T_F = T * 9/5 + 32;\nlet HI_F = -42.379 + 2.04901523 * T_F + 10.14333127 * RH\n           - 0.22475541 * T_F * RH - 6.83783e-3 * T_F * T_F\n           - 5.481717e-2 * RH * RH + 1.22874e-3 * T_F * T_F * RH\n           + 8.5282e-4 * T_F * RH * RH - 1.99e-6 * T_F * T_F * RH * RH;\nlet HI_C = (HI_F - 32) * 5/9;\n\nif (isNaN(HI_C)) {\n    node.error(\"Eroare: HI_C este NaN\");\n    return null;\n}\n\n// Return messages\nlet dewPoint_msg  = {payload: parseFloat(dewPoint.toFixed(2))};\nlet heatIndex_msg = {payload: parseFloat(HI_C.toFixed(2))};\n\nreturn [dewPoint_msg, heatIndex_msg];\n",
        "outputs": 2,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 510,
        "y": 520,
        "wires": [
            [
                "5ff4e0ec197f9b2b"
            ],
            [
                "ca1ef1c159312e3c"
            ]
        ]
    },
    {
        "id": "5ff4e0ec197f9b2b",
        "type": "ui_gauge",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "d6111cb0923bd418",
        "order": 1,
        "width": 6,
        "height": 3,
        "gtype": "gage",
        "title": "DEW point",
        "label": "C",
        "format": "{{value}}",
        "min": "-15",
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "diff": false,
        "className": "",
        "x": 870,
        "y": 520,
        "wires": []
    },
    {
        "id": "ca1ef1c159312e3c",
        "type": "ui_gauge",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "d6111cb0923bd418",
        "order": 2,
        "width": 6,
        "height": 3,
        "gtype": "gage",
        "title": "ITU - Heat index",
        "label": "units",
        "format": "{{value}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "diff": false,
        "className": "",
        "x": 890,
        "y": 560,
        "wires": []
    },
    {
        "id": "88cfd88a97187bb5",
        "type": "function",
        "z": "b8293252ace58d54",
        "name": "Calculate IAQ, TVoC and eCO2 estimat",
        "func": "// Prelum valorile primite de la senzor (Zigbee2MQTT -> msg.payload)\n\nlet T  = Number(msg.payload.temperature);\nlet RH = Number(msg.payload.humidity);\nlet gas_Ohm = msg.payload.co2_12;      // here is am workaround, because the value from zigbee2mqtt is in KOhm\nlet gas_Kohm = gas_Ohm * 1000.0;       // kOhm\n\nfunction constrain(val, min, max) {\n    return Math.max(min, Math.min(max, val));\n}\n\n// ==== Estimare eCO2 ====\nfunction estimate_eCO2(gas_Ohm, humidity, temperature) {\n    if (gas_Ohm <= 0) return -1;\n\n    let temp_factor = constrain(1.0 + (temperature - 25.0) * 0.02, 0.7, 1.3);\n    let hum_factor  = constrain(1.0 + (humidity - 50.0) * 0.01, 0.7, 1.3);\n\n    let eCO2_raw = 250.0 + (5000.0 - 250.0) * (100.0 / gas_Ohm);\n    let eCO2 = eCO2_raw * temp_factor * hum_factor;\n\n    return constrain(Math.round(eCO2), 400, 5000);\n}\n\n// ==== Estimare TVOC ====\nfunction estimate_TVOC(gas_Ohm, humidity, temperature) {\n    if (gas_Ohm <= 0) return -1;\n\n    let temp_factor = constrain(1.0 + (temperature - 25.0) * 0.02, 0.7, 1.3);\n    let hum_factor  = constrain(1.0 + (humidity - 50.0) * 0.01, 0.7, 1.3);\n\n    let tvoc_raw = 5.0 + (1000.0 - 5.0) * (100.0 / gas_Ohm);\n    let tvoc = tvoc_raw * temp_factor * hum_factor;\n\n    return constrain(Math.round(tvoc), 0, 1000);\n}\n\n// ==== Estimare IAQ ====\nfunction compute_IAQ(gas_resistance, humidity) {\n    const gas_min = 60000.0;\n    const gas_max = 115000.0;\n\n    let gas_score = (gas_resistance - gas_min) / (gas_max - gas_min);\n    gas_score = constrain(gas_score, 0.0, 1.0);\n\n    let hum_score;\n    if (humidity >= 30.0 && humidity <= 60.0) {\n        hum_score = 1.0;\n    } else {\n        let diff = (humidity < 30.0) ? (30.0 - humidity) : (humidity - 60.0);\n        hum_score = 1.0 - (diff / 20.0);\n        hum_score = constrain(hum_score, 0.0, 1.0);\n    }\n\n    let air_score = (gas_score * 0.9) + (hum_score * 0.1);\n    let iaq = 500.0 * (1.0 - air_score);\n\n    return Math.round(iaq);\n}\n\n// Calculm valorile i le adugm n mesaj\nmsg.payload.eco2 = estimate_eCO2(gas_Kohm, RH, T);\nmsg.payload.tvoc = estimate_TVOC(gas_Kohm, RH, T);\nmsg.payload.iaq  = compute_IAQ(gas_Kohm, RH);\n\n//return msg;\n\n\n\n// --------------------------\nlet iaq_msg  = {payload: msg.payload.iaq + \" index\"};\nlet tvoc_msg = {payload: msg.payload.tvoc + \" ppb\"};\nlet eco2_msg = {payload: msg.payload.eco2 + \" ppm\"};\n\n// Return messages\nreturn [iaq_msg, tvoc_msg, eco2_msg];\n\n// return msg;",
        "outputs": 3,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 680,
        "wires": [
            [
                "31ab4a08ee77f818",
                "ad52b873564dbdfc"
            ],
            [
                "ff900eb3ceb70e99",
                "cfd8c37668c9e12c"
            ],
            [
                "da013481dab700f2",
                "609b7785ad29012b"
            ]
        ]
    },
    {
        "id": "31ab4a08ee77f818",
        "type": "ui_text",
        "z": "b8293252ace58d54",
        "group": "d6111cb0923bd418",
        "order": 5,
        "width": 4,
        "height": 1,
        "name": "",
        "label": "IAQ estimat",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 890,
        "y": 660,
        "wires": []
    },
    {
        "id": "ff900eb3ceb70e99",
        "type": "ui_text",
        "z": "b8293252ace58d54",
        "group": "d6111cb0923bd418",
        "order": 9,
        "width": 4,
        "height": 1,
        "name": "",
        "label": "TVoC estimat",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 900,
        "y": 700,
        "wires": []
    },
    {
        "id": "da013481dab700f2",
        "type": "ui_text",
        "z": "b8293252ace58d54",
        "group": "d6111cb0923bd418",
        "order": 13,
        "width": 4,
        "height": 1,
        "name": "",
        "label": "eCO2 estimat",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 900,
        "y": 740,
        "wires": []
    },
    {
        "id": "ad52b873564dbdfc",
        "type": "ui_chart",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "d6111cb0923bd418",
        "order": 4,
        "width": 8,
        "height": 3,
        "label": "IAQ estimat",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": 1,
        "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": 890,
        "y": 800,
        "wires": [
            []
        ]
    },
    {
        "id": "cfd8c37668c9e12c",
        "type": "ui_chart",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "d6111cb0923bd418",
        "order": 8,
        "width": 8,
        "height": 3,
        "label": "TVoC estimat",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": 1,
        "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": 900,
        "y": 840,
        "wires": [
            []
        ]
    },
    {
        "id": "609b7785ad29012b",
        "type": "ui_chart",
        "z": "b8293252ace58d54",
        "name": "",
        "group": "d6111cb0923bd418",
        "order": 12,
        "width": 8,
        "height": 3,
        "label": "eCO2 estimat",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": 1,
        "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": 900,
        "y": 880,
        "wires": [
            []
        ]
    },
    {
        "id": "5cc699693a880090",
        "type": "function",
        "z": "b8293252ace58d54",
        "name": "Calculate altitude relative",
        "func": "// Valori primite de la senzor\nlet pressure = Number(msg.payload.pressure_11);  // presiunea curent n hPa\n\n// Presiune standard la nivelul mrii (identic cu #define SEALEVELPRESSURE_HPA)\nconst P0 = 1013.25;\n\n// Formula altitudine relativ (metri)\nlet altitude = 44330 * (1 - Math.pow(pressure / P0, 1 / 5.255));\n\naltitude = Math.round(altitude);\n\nmsg.payload = altitude + \" m\";\n\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 500,
        "y": 940,
        "wires": [
            [
                "d0cd58eb9a96eb7f"
            ]
        ]
    },
    {
        "id": "d0cd58eb9a96eb7f",
        "type": "ui_text",
        "z": "b8293252ace58d54",
        "group": "d6111cb0923bd418",
        "order": 15,
        "width": 5,
        "height": 1,
        "name": "",
        "label": "Altitude relative",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000",
        "x": 910,
        "y": 940,
        "wires": []
    },
    {
        "id": "d79ce9d041a1e5c9",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "205d7ba8bf91bdd2",
        "order": 8,
        "width": 5,
        "height": 1
    },
    {
        "id": "6c18ae3b3e87710d",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 3,
        "width": 4,
        "height": 1
    },
    {
        "id": "a6f32f4e2f871677",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 6,
        "width": 4,
        "height": 1
    },
    {
        "id": "75bb55a05cb3cf2e",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 7,
        "width": 4,
        "height": 1
    },
    {
        "id": "87f62558d5bff191",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 10,
        "width": 4,
        "height": 1
    },
    {
        "id": "c311ba8e8cfb8821",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 11,
        "width": 4,
        "height": 1
    },
    {
        "id": "3c0e3838de77be3e",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 14,
        "width": 4,
        "height": 1
    },
    {
        "id": "04f089ba5d65c8fb",
        "type": "ui_spacer",
        "z": "b8293252ace58d54",
        "name": "spacer",
        "group": "d6111cb0923bd418",
        "order": 16,
        "width": 7,
        "height": 1
    },
    {
        "id": "590e3ceaadf4028f",
        "type": "mqtt-broker",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthRetain": "false",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closeRetain": "false",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "205d7ba8bf91bdd2",
        "type": "ui_group",
        "name": "Direct readings from sensor",
        "tab": "cf44826154d802f1",
        "order": 1,
        "disp": true,
        "width": "12",
        "collapse": false,
        "className": ""
    },
    {
        "id": "d6111cb0923bd418",
        "type": "ui_group",
        "name": "Calculated data from sensors",
        "tab": "cf44826154d802f1",
        "order": 2,
        "disp": true,
        "width": 12,
        "collapse": false,
        "className": ""
    },
    {
        "id": "cf44826154d802f1",
        "type": "ui_tab",
        "name": "ZigMonitor",
        "icon": "dashboard",
        "order": 4,
        "disabled": false,
        "hidden": false
    }
]

AsyncAPDS9306 Arduino library

C/C++
No preview (download only).

KXTJ3-1057 Arduino library

C/C++
No preview (download only).

Credits

Mihai Popa
10 projects • 9 followers
I am working as test engineer for navigation systems in auto industry. I am passionate about science, IoT, ML, MCU programming, SF movies.

Comments