Qolsys IQ Panel 2 and 3rd party integration

@JasonLee One thing to be careful of when using those HA nodes: if you create a sensor in a loop (e.g. through an array), that node loses track of the previous sensor created. So unless you’ve cached the name of the sensor, you won’t be able to easily update it.

My description probably doesn’t make sense but I banged my head on this wall many months ago and decided not to manage (create) HA entities in node red.

@ahigginbotham it’s not where you’d expect it to be. I know you had to use the dealer code and go to advanced settings and i think it was buried in wifi settings or something weird. googled and found this.

From the main screen, click the small grey bar at the top. Choose Settings > Advanced Settings > enter Dealer Code (default 2222) > Installation > Devices > WIFI Devices > 3rd Party Connections > enable Remote Device Access > OK. The panel will then reboot to apply the changes.
Read more: Control4 Integration for Qolsys IQ Panel 2 Plus - Alarm Grid

It’s also not a feature in the factory firmware. I don’t know exactly what OS version in which it was introduced, but run an update cycle or two should get you current and make that feature available.

I wasn’t thinking of anything complicated, I have zero programming experience. I thought I could create the binary sensors manually in Node Red rather that try to have them dynamically created. I may just need to keep any eye on this thread until someone can post a working solution, I don’t feel like I’m getting anywhere.

@phunkymonkey does your Node Red flow include binary sensors that update in HA? Do you mind sharing what you have so far?

I had a terrible time with the autoblocking on the panel itself (thus the request for the iptables config), and set it aside for a few days to see if it would clear itself up. Seems like NodeRed can be a little too aggressive in reestablishing the connection, and will get itself blocked sometimes. Rebooting the panel seems to clear it up, so long as you stop NR and wait for the panel to be ready before starting again.

Anywho… my first use case is to populate status where I don’t have coverage from other HA sensors. From there, I’ll build some automations based on those status changes, but wanted to get that first part of the chain working before getting any more complicated.

That said, I set up a series of input booleans to use as the raw devices to represent the doors and windows that my alarm system cover. Because I needed to turn them on and off, I also parse the zone status and map to the turn_on and turn_off services for the HA json.

Going forward, I will likely streamline this by removing some of the looping, since everything will have a 1:1 mapping to entities in HA.

[
    {
        "id": "cbfaf013.0e5e",
        "type": "tab",
        "label": "Monitor QolSys Panel",
        "disabled": false,
        "info": ""
    },
    {
        "id": "9d021c07.d9795",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    },
    {
        "id": "8ab3acad.bd0fb",
        "type": "server",
        "name": "Home Assistant",
        "legacy": false,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": false,
        "cacheJson": true
    },
    {
        "id": "40b27fca.5057",
        "type": "ui_base",
        "theme": {
            "name": "theme-light",
            "lightTheme": {
                "default": "#0094CE",
                "baseColor": "#0094CE",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
                "edited": true,
                "reset": false
            },
            "darkTheme": {
                "default": "#097479",
                "baseColor": "#097479",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
                "edited": false
            },
            "customTheme": {
                "name": "Untitled Theme 1",
                "default": "#4B7930",
                "baseColor": "#4B7930",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
            },
            "themeState": {
                "base-color": {
                    "default": "#0094CE",
                    "value": "#0094CE",
                    "edited": false
                },
                "page-titlebar-backgroundColor": {
                    "value": "#0094CE",
                    "edited": false
                },
                "page-backgroundColor": {
                    "value": "#fafafa",
                    "edited": false
                },
                "page-sidebar-backgroundColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "group-textColor": {
                    "value": "#1bbfff",
                    "edited": false
                },
                "group-borderColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "group-backgroundColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "widget-textColor": {
                    "value": "#111111",
                    "edited": false
                },
                "widget-backgroundColor": {
                    "value": "#0094ce",
                    "edited": false
                },
                "widget-borderColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "base-font": {
                    "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
                }
            },
            "angularTheme": {
                "primary": "indigo",
                "accents": "blue",
                "warn": "red",
                "background": "grey"
            }
        },
        "site": {
            "name": "Node-RED Dashboard",
            "hideToolbar": "false",
            "allowSwipe": "false",
            "lockMenu": "false",
            "allowTempTheme": "true",
            "dateFormat": "DD/MM/YYYY",
            "sizes": {
                "sx": 48,
                "sy": 48,
                "gx": 6,
                "gy": 6,
                "cx": 6,
                "cy": 6,
                "px": 0,
                "py": 0
            }
        }
    },
    {
        "id": "a92cf1.8c434b1",
        "type": "inject",
        "z": "cbfaf013.0e5e",
        "name": "go",
        "props": [],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "x": 90,
        "y": 100,
        "wires": [
            [
                "df1b46c2.dc0748"
            ]
        ]
    },
    {
        "id": "df1b46c2.dc0748",
        "type": "exec",
        "z": "cbfaf013.0e5e",
        "command": "curl -kN --http0.9 https://192.168.99.99:12345",
        "addpay": true,
        "append": "",
        "useSpawn": "true",
        "timer": "",
        "oldrc": false,
        "name": "curl",
        "x": 110,
        "y": 180,
        "wires": [
            [
                "1f5ac981.6ccdde",
                "1edaf367.8f44ed"
            ],
            [
                "f17d89c8.de8bf"
            ],
            [
                "cf10d274.0242e"
            ]
        ]
    },
    {
        "id": "cf10d274.0242e",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "return (exit) codes",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 690,
        "y": 120,
        "wires": []
    },
    {
        "id": "1f5ac981.6ccdde",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "activity events and updates",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 720,
        "y": 32,
        "wires": []
    },
    {
        "id": "f17d89c8.de8bf",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "Just outputs the curl progress, not the actual output",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 800,
        "y": 76,
        "wires": []
    },
    {
        "id": "1edaf367.8f44ed",
        "type": "switch",
        "z": "cbfaf013.0e5e",
        "name": "Ignore ACK",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "ACK",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 230,
        "y": 240,
        "wires": [
            [],
            [
                "9a07870e.d047d8"
            ]
        ]
    },
    {
        "id": "9a07870e.d047d8",
        "type": "json",
        "z": "cbfaf013.0e5e",
        "name": "convert update to json",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 420,
        "y": 240,
        "wires": [
            [
                "9c24717d.c5031",
                "6d8421cd.eae33"
            ]
        ]
    },
    {
        "id": "9c24717d.c5031",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "converted json",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 640,
        "y": 160,
        "wires": []
    },
    {
        "id": "e535c607.f893f8",
        "type": "api-call-service",
        "z": "cbfaf013.0e5e",
        "name": "",
        "server": "8ab3acad.bd0fb",
        "version": 1,
        "debugenabled": true,
        "service_domain": "",
        "service": "",
        "entityId": "",
        "data": "",
        "dataType": "json",
        "mergecontext": "",
        "output_location": "",
        "output_location_type": "none",
        "mustacheAltTags": false,
        "x": 550,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "6d8421cd.eae33",
        "type": "function",
        "z": "cbfaf013.0e5e",
        "name": "put entity_ids in msg",
        "func": "zid = msg.payload[\"zone\"][\"zone_id\"]\nzstatus = msg.payload[\"zone\"][\"status\"]\nentity_ids = []\nswitch (zid) {\n    case 5:\n        entity_ids = [\n            \"input_boolean.alarm_craft_room_window\"\n            ]\n        break\n    case 16:\n        entity_ids = [\n            \"input_boolean.alarm_front_door\"\n            ]\n        break\n    case 21:\n        entity_ids = [\n            \"input_boolean.alarm_big_garage_door\"\n            ]\n        break\n    case 22:\n        entity_ids = [\n            \"input_boolean.alarm_back_door\"\n            ]\n        break\n    case 13:\n        entity_ids = [\n            \"input_boolean.alarm_car_port_door\"\n            ]\n        break\n}\n\n//node.warn(\"zid: \" + zid + \", status: \" + zstatus + \", entities: \" + entity_ids)\n\nmsg.entity_ids = entity_ids\nmsg.zstatus = zstatus\n//node.warn(msg)\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 660,
        "y": 240,
        "wires": [
            [
                "929374ec.595c48",
                "ed36d599.984728"
            ]
        ]
    },
    {
        "id": "7b5ce640.877ee8",
        "type": "template",
        "z": "cbfaf013.0e5e",
        "name": "json for HA",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"domain\":\"input_boolean\",\n    \"service\":\"{{zstatus}}\",\n    \"data\":\n        {\n            \"entity_id\":\"{{payload}}\"\n        }\n}",
        "output": "json",
        "x": 310,
        "y": 440,
        "wires": [
            [
                "e535c607.f893f8",
                "aad1aaf7.b1c3e8",
                "929374ec.595c48"
            ]
        ]
    },
    {
        "id": "929374ec.595c48",
        "type": "array-loop",
        "z": "cbfaf013.0e5e",
        "name": "loop entity_ids",
        "key": "al929374ec595c48",
        "keyType": "msg",
        "reset": true,
        "resetValue": "value-null",
        "array": "entity_ids",
        "arrayType": "msg",
        "x": 220,
        "y": 300,
        "wires": [
            [
                "1a32f917.444eb7"
            ],
            [
                "c2a3cc7c.d5ef1",
                "14e1993f.3790f7"
            ]
        ]
    },
    {
        "id": "aad1aaf7.b1c3e8",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "json for HA",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 590,
        "y": 440,
        "wires": []
    },
    {
        "id": "c2a3cc7c.d5ef1",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "looped payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 620,
        "y": 400,
        "wires": []
    },
    {
        "id": "1a32f917.444eb7",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "end of loop payload",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 340,
        "wires": []
    },
    {
        "id": "ed36d599.984728",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "added entity ids",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 930,
        "y": 320,
        "wires": []
    },
    {
        "id": "14e1993f.3790f7",
        "type": "change",
        "z": "cbfaf013.0e5e",
        "name": "",
        "rules": [
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "Open",
                "fromt": "str",
                "to": "turn_on",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "Closed",
                "fromt": "str",
                "to": "turn_off",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 200,
        "y": 500,
        "wires": [
            [
                "7b5ce640.877ee8",
                "d4ac3aed.e67338"
            ]
        ]
    },
    {
        "id": "d4ac3aed.e67338",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 520,
        "y": 620,
        "wires": []
    }
]

Well… I guess I’m just impatient :wink:.

image

Made the NR flow more linear, only handling one entity per update, but able to set status to both on and off.

[
    {
        "id": "cbfaf013.0e5e",
        "type": "tab",
        "label": "Monitor QolSys Panel",
        "disabled": false,
        "info": ""
    },
    {
        "id": "a92cf1.8c434b1",
        "type": "inject",
        "z": "cbfaf013.0e5e",
        "name": "go",
        "props": [],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "x": 90,
        "y": 100,
        "wires": [
            [
                "df1b46c2.dc0748"
            ]
        ]
    },
    {
        "id": "df1b46c2.dc0748",
        "type": "exec",
        "z": "cbfaf013.0e5e",
        "command": "curl -kN --http0.9 https://192.168.99.99:12345",
        "addpay": true,
        "append": "",
        "useSpawn": "true",
        "timer": "",
        "oldrc": false,
        "name": "curl",
        "x": 110,
        "y": 180,
        "wires": [
            [
                "1f5ac981.6ccdde",
                "1edaf367.8f44ed"
            ],
            [
                "f17d89c8.de8bf"
            ],
            [
                "cf10d274.0242e"
            ]
        ]
    },
    {
        "id": "cf10d274.0242e",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "return (exit) codes",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 430,
        "y": 148,
        "wires": []
    },
    {
        "id": "1f5ac981.6ccdde",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "activity events and updates",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 460,
        "y": 60,
        "wires": []
    },
    {
        "id": "f17d89c8.de8bf",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "Just outputs the curl progress, not the actual output",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 104,
        "wires": []
    },
    {
        "id": "1edaf367.8f44ed",
        "type": "switch",
        "z": "cbfaf013.0e5e",
        "name": "Ignore ACK",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "ACK",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 230,
        "y": 240,
        "wires": [
            [],
            [
                "9a07870e.d047d8"
            ]
        ]
    },
    {
        "id": "9a07870e.d047d8",
        "type": "json",
        "z": "cbfaf013.0e5e",
        "name": "convert update to json",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 300,
        "y": 300,
        "wires": [
            [
                "9c24717d.c5031",
                "6d8421cd.eae33"
            ]
        ]
    },
    {
        "id": "9c24717d.c5031",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "converted json",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 600,
        "y": 200,
        "wires": []
    },
    {
        "id": "e535c607.f893f8",
        "type": "api-call-service",
        "z": "cbfaf013.0e5e",
        "name": "",
        "server": "8ab3acad.bd0fb",
        "version": 1,
        "debugenabled": true,
        "service_domain": "",
        "service": "",
        "entityId": "",
        "data": "",
        "dataType": "json",
        "mergecontext": "",
        "output_location": "",
        "output_location_type": "none",
        "mustacheAltTags": false,
        "x": 670,
        "y": 600,
        "wires": [
            []
        ]
    },
    {
        "id": "6d8421cd.eae33",
        "type": "function",
        "z": "cbfaf013.0e5e",
        "name": "put entity_ids in msg",
        "func": "zid = msg.payload[\"zone\"][\"zone_id\"]\nzstatus = msg.payload[\"zone\"][\"status\"]\nentity_id = \"\"\nswitch (zid) {\n    case 5:\n        entity_id = \"input_boolean.alarm_craft_room_window\"\n        break\n    case 16:\n        entity_id = \"input_boolean.alarm_front_door\"\n        break\n    case 21:\n        entity_id = \"input_boolean.alarm_big_garage_door\"\n        break\n    case 22:\n        entity_id = \"input_boolean.alarm_back_door\"\n        break\n    case 13:\n        entity_id = \"input_boolean.alarm_car_port_door\"\n        break\n}\n\n//node.warn(\"zid: \" + zid + \", status: \" + zstatus + \", entities: \" + entity_ids)\n\nmsg.entity_id = entity_id\nmsg.zstatus = zstatus\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 380,
        "y": 360,
        "wires": [
            [
                "ed36d599.984728",
                "14e1993f.3790f7"
            ]
        ]
    },
    {
        "id": "7b5ce640.877ee8",
        "type": "template",
        "z": "cbfaf013.0e5e",
        "name": "json for HA",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"domain\":\"input_boolean\",\n    \"service\":\"{{zstatus}}\",\n    \"data\":\n        {\n            \"entity_id\":\"{{entity_id}}\"\n        }\n}",
        "output": "json",
        "x": 550,
        "y": 480,
        "wires": [
            [
                "63206646.c523d8"
            ]
        ]
    },
    {
        "id": "aad1aaf7.b1c3e8",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "json for HA",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 770,
        "y": 520,
        "wires": []
    },
    {
        "id": "ed36d599.984728",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "added entity ids",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 640,
        "y": 260,
        "wires": []
    },
    {
        "id": "14e1993f.3790f7",
        "type": "change",
        "z": "cbfaf013.0e5e",
        "name": "",
        "rules": [
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "Open",
                "fromt": "str",
                "to": "turn_on",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "Closed",
                "fromt": "str",
                "to": "turn_off",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 480,
        "y": 420,
        "wires": [
            [
                "7b5ce640.877ee8",
                "d4ac3aed.e67338"
            ]
        ]
    },
    {
        "id": "d4ac3aed.e67338",
        "type": "debug",
        "z": "cbfaf013.0e5e",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 670,
        "y": 360,
        "wires": []
    },
    {
        "id": "63206646.c523d8",
        "type": "switch",
        "z": "cbfaf013.0e5e",
        "name": "",
        "property": "entity_id",
        "propertyType": "msg",
        "rules": [
            {
                "t": "nempty"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 590,
        "y": 540,
        "wires": [
            [
                "e535c607.f893f8",
                "aad1aaf7.b1c3e8"
            ]
        ]
    },
    {
        "id": "8ab3acad.bd0fb",
        "type": "server",
        "name": "Home Assistant",
        "legacy": false,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": false,
        "cacheJson": true
    }
]

Also, here’s my config for the input boolean entities from the tail end of my configuration.yaml:

# sensors from alarm system via node-red
input_boolean:
  alarm_car_port_door:
    name: Car Port Door (wired)
    icon: mdi:door-closed
  alarm_front_door:
    name: Front Door (wired)
    icon: mdi:door-closed
  alarm_small_garage_door:
    name: Small Garage Door (wired)
    icon: mdi:door-closed
  alarm_back_door:
    name: Back Door (wired)
    icon: mdi:door-closed

This is pretty awesome. I bought that panel for the alarm.com integration and then they deprecated that. I just installed Node Red add-on today and have never used it. Is the code in the top what the graphical node-red produces? Then the sensors are in your YAML?

Also did the flakiness go away with the connection? All I want to do is be able to use my door and motion statuses to automate things in HA. This is a better solution for me than alarm.com would be anyway. I just want to make sure I understand what you did here.

I got this working following your example. Thanks so much. The only issue I have is with motion sensors. They just flash on/off in less than a second. Are you using motion sensors and if so are you doing something different than the binary switch to utilize them. This was my primary goal to turn on a light when someone entered a room based off the motion.

I got some help and modified the Node Red Flow to use the HA Node Red integration. This simplifies things a little by having Node Red create the binary sensors and populate/update them in HA automatically.

To get this working you will need to install the Node Red companion component through HACs:

  1. Import Flow

  2. Modify “Curl” node with your panel IP address

  3. Modify “put entity_ids in msg” node. Change the outputs to however many panel connected sensors you want to monitor. In my example 16. The panel has a list of all the connected devices. Go into the setting and write them down. The list order will determine the number ID (zid) of each device. The device ID # is = case #. List all your devices and their case # (zid # aka device ID #). Modify the array so that the number of ‘null’ s is equal to number of devices - 1.

  4. add a binary senor node for each device and connect them in the right order to ‘put entity_ids in msg’ node. As soon as you deploy the Flow the Node Red integration will create corresponding entities in HA, so make sure you rename, and delete any of mine so that you don’t create unwanted entities.

My flow:

[
    {
        "id": "ba898990.4dd3e8",
        "type": "tab",
        "label": "Monitor QolSys Panel",
        "disabled": false,
        "info": ""
    },
    {
        "id": "fd3d1b3a.4d0928",
        "type": "inject",
        "z": "ba898990.4dd3e8",
        "name": "go",
        "props": [],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "x": 90,
        "y": 20,
        "wires": [
            [
                "7796cc60.cd6384"
            ]
        ]
    },
    {
        "id": "7796cc60.cd6384",
        "type": "exec",
        "z": "ba898990.4dd3e8",
        "command": "curl -kN --http0.9 https://192.168.2.50:12345",
        "addpay": true,
        "append": "",
        "useSpawn": "true",
        "timer": "",
        "oldrc": false,
        "name": "curl",
        "x": 130,
        "y": 80,
        "wires": [
            [
                "ba649a6f.3d0cf8"
            ],
            [
                "6ca13117.4beca"
            ],
            [
                "643511a.cb42bf"
            ]
        ]
    },
    {
        "id": "643511a.cb42bf",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "return (exit) codes",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 430,
        "y": 60,
        "wires": []
    },
    {
        "id": "6ca13117.4beca",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "Just outputs the curl progress, not the actual output",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 490,
        "y": 20,
        "wires": []
    },
    {
        "id": "ba649a6f.3d0cf8",
        "type": "switch",
        "z": "ba898990.4dd3e8",
        "name": "Ignore ACK",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "ACK",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 190,
        "y": 140,
        "wires": [
            [
                "6c645525.266eec"
            ],
            [
                "fe4c2051.1574a"
            ]
        ]
    },
    {
        "id": "fe4c2051.1574a",
        "type": "json",
        "z": "ba898990.4dd3e8",
        "name": "convert update to json",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 260,
        "y": 200,
        "wires": [
            [
                "98d001ba.58635",
                "d0a2b915.6f1ad8"
            ]
        ]
    },
    {
        "id": "98d001ba.58635",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "converted json",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 480,
        "y": 100,
        "wires": []
    },
    {
        "id": "d0a2b915.6f1ad8",
        "type": "function",
        "z": "ba898990.4dd3e8",
        "name": "put entity_ids in msg",
        "func": "zid = msg.payload[\"zone\"][\"zone_id\"];\nzstatus = msg.payload[\"zone\"][\"status\"];\n//entity_id = \"\";\nmsg.zstatus = zstatus;\n\nswitch (zid) {\n    case 1:\n        return [msg,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 2:\n        return [null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 3:\n        return [null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 4:\n        return [null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 5:\n        return [null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null]\n    case 6:\n        return [null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null]\n    case 7:\n        return [null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null]     \n    case 8:\n        return [null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null]   \n    case 9:\n        return [null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null]\n    case 10:\n        return [null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null]\n    case 11:\n        return [null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null]\n    case 12:\n        return [null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null]\n    case 13:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null]\n    case 14:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null]\n    case 15:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null]     \n    case 16:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg]\n}\n\n//node.warn(\"zid: \" + zid + \", status: \" + zstatus + \", entities: \" + entity_ids)",
        "outputs": 16,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 220,
        "y": 700,
        "wires": [
            [
                "9022a5b8.478c58",
                "4aa7a1bc.426c9"
            ],
            [
                "a35218ae.d18e28"
            ],
            [
                "60ca2505.845d1c"
            ],
            [
                "df396c28.eef64"
            ],
            [
                "19770ba8.11c6d4"
            ],
            [
                "d8ba25f6.efce58"
            ],
            [
                "dcc747aa.a378b8"
            ],
            [
                "1722acaa.485883"
            ],
            [
                "35d56d5d.bd9c62"
            ],
            [
                "fac1a046.e2162"
            ],
            [
                "71d87ba9.be99e4"
            ],
            [
                "d1b097c8.d89308"
            ],
            [
                "964b0753.0aa248"
            ],
            [
                "83bc1403.532158"
            ],
            [
                "df4d7e82.5323b"
            ],
            [
                "5e02e726.7dddb8"
            ]
        ]
    },
    {
        "id": "9022a5b8.478c58",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "added entity ids",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 180,
        "wires": []
    },
    {
        "id": "60ca2505.845d1c",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Garage Door",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Garage Door"
            },
            {
                "property": "device_class",
                "value": "door"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 360,
        "wires": [
            []
        ]
    },
    {
        "id": "6c645525.266eec",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 510,
        "y": 140,
        "wires": []
    },
    {
        "id": "4aa7a1bc.426c9",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Front Door",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Front Door"
            },
            {
                "property": "device_class",
                "value": "door"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "a35218ae.d18e28",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Sliding Door",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Sliding Door"
            },
            {
                "property": "device_class",
                "value": "door"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 300,
        "wires": [
            []
        ]
    },
    {
        "id": "df396c28.eef64",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Master Bedroom Left Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Master Bedroom Left Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 610,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "19770ba8.11c6d4",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Master Bedroom Right Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Master Bedroom Right Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 610,
        "y": 480,
        "wires": [
            []
        ]
    },
    {
        "id": "d8ba25f6.efce58",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Livingroom Left Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Livingroom Left Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 590,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "dcc747aa.a378b8",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Livingroom Right Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Livingroom Right Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 590,
        "y": 600,
        "wires": [
            []
        ]
    },
    {
        "id": "1722acaa.485883",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Dining Room Left Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Dining Room Left Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 590,
        "y": 660,
        "wires": [
            []
        ]
    },
    {
        "id": "35d56d5d.bd9c62",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Dining Room Right Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Dining Room Right Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 600,
        "y": 720,
        "wires": [
            []
        ]
    },
    {
        "id": "fac1a046.e2162",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Motion Detector",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Hallway Motion Detector"
            },
            {
                "property": "device_class",
                "value": "motion"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 560,
        "y": 780,
        "wires": [
            []
        ]
    },
    {
        "id": "71d87ba9.be99e4",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Smoke Detector",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Smoke Detector"
            },
            {
                "property": "device_class",
                "value": "smoke"
            },
            {
                "property": "icon",
                "value": "mdi:fire-truck"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 560,
        "y": 840,
        "wires": [
            []
        ]
    },
    {
        "id": "d1b097c8.d89308",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Auxilary Pendant",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Auxilary Pendant"
            },
            {
                "property": "device_class",
                "value": "safety"
            },
            {
                "property": "icon",
                "value": "mdi:shield-home"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 570,
        "y": 900,
        "wires": [
            []
        ]
    },
    {
        "id": "964b0753.0aa248",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Key FOB",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Key FOB"
            },
            {
                "property": "device_class",
                "value": "safety"
            },
            {
                "property": "icon",
                "value": "mdi:shield-home-outline"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 540,
        "y": 960,
        "wires": [
            []
        ]
    },
    {
        "id": "83bc1403.532158",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Key FOB2",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Key FOB2"
            },
            {
                "property": "device_class",
                "value": "safety"
            },
            {
                "property": "icon",
                "value": "mdi:shield-home-outline"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 1020,
        "wires": [
            []
        ]
    },
    {
        "id": "df4d7e82.5323b",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Panel Motion",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "IQ2 Panel Motion"
            },
            {
                "property": "device_class",
                "value": "motion"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 1080,
        "wires": [
            []
        ]
    },
    {
        "id": "5e02e726.7dddb8",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Panel Glass Break",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "IQ2 Panel Glass Break"
            },
            {
                "property": "device_class",
                "value": "sound"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [
            {
                "property": "payload_on",
                "value": "Open",
                "valueType": "str"
            },
            {
                "property": "payload_off",
                "value": "Closed",
                "valueType": "str"
            }
        ],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 570,
        "y": 1140,
        "wires": [
            []
        ]
    },
    {
        "id": "934a7469.f8dfc8",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    }
]

Huge thanks to Xtacy over on the HA Discord for the help on this

1 Like

I just realized my motion sensor wasn’t even communicating with the panel. My motion sensor source was set to use S-line instead of SecurityRF-319.
Settings / Advanced Settings / Installation / Devices / Security Sensors / Edit Sensors / Find your motion sensor tap edit, and change source.

You can turn on the chime just to verify that the motion senor is activating and notifying the panel

So the motion sensor status remains “closed”. Instead it looks like the panel is reporting motion with zone_event_type, as ZONE_ACTIVE (motion) and ZONE_UPDATE (clear).

So I updated my flow with a second function for devices using that information. I only have one motion sensor, but I’ve grouped in the panel motion sensor. The panel motion sensor zone_event_type is always zone_active and status is always ‘closed’, so I’m not sure how or if it’s possible to get that working

[
    {
        "id": "ba898990.4dd3e8",
        "type": "tab",
        "label": "Monitor QolSys Panel",
        "disabled": false,
        "info": ""
    },
    {
        "id": "fd3d1b3a.4d0928",
        "type": "inject",
        "z": "ba898990.4dd3e8",
        "name": "go",
        "props": [],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "x": 90,
        "y": 20,
        "wires": [
            [
                "7796cc60.cd6384"
            ]
        ]
    },
    {
        "id": "7796cc60.cd6384",
        "type": "exec",
        "z": "ba898990.4dd3e8",
        "command": "curl -kN --http0.9 https://192.168.2.35:12345",
        "addpay": true,
        "append": "",
        "useSpawn": "true",
        "timer": "",
        "oldrc": false,
        "name": "curl",
        "x": 130,
        "y": 80,
        "wires": [
            [
                "ba649a6f.3d0cf8"
            ],
            [
                "6ca13117.4beca"
            ],
            [
                "643511a.cb42bf"
            ]
        ]
    },
    {
        "id": "643511a.cb42bf",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "return (exit) codes",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 430,
        "y": 60,
        "wires": []
    },
    {
        "id": "6ca13117.4beca",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "Just outputs the curl progress, not the actual output",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 490,
        "y": 20,
        "wires": []
    },
    {
        "id": "ba649a6f.3d0cf8",
        "type": "switch",
        "z": "ba898990.4dd3e8",
        "name": "Ignore ACK",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "ACK",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 190,
        "y": 140,
        "wires": [
            [
                "6c645525.266eec"
            ],
            [
                "fe4c2051.1574a"
            ]
        ]
    },
    {
        "id": "fe4c2051.1574a",
        "type": "json",
        "z": "ba898990.4dd3e8",
        "name": "convert update to json",
        "property": "payload",
        "action": "",
        "pretty": true,
        "x": 260,
        "y": 200,
        "wires": [
            [
                "98d001ba.58635",
                "d0a2b915.6f1ad8",
                "2915e436.c4c6bc"
            ]
        ]
    },
    {
        "id": "98d001ba.58635",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "converted json",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 480,
        "y": 100,
        "wires": []
    },
    {
        "id": "d0a2b915.6f1ad8",
        "type": "function",
        "z": "ba898990.4dd3e8",
        "name": "Find Open/Closed Status \\n Doors + Windows ",
        "func": "zid = msg.payload[\"zone\"][\"zone_id\"];\nzstatus = msg.payload[\"zone\"][\"status\"];\n//entity_id = \"\";\nmsg.zstatus = zstatus;\n\nswitch (zid) {\n    case 1:\n        return [msg,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 2:\n        return [null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 3:\n        return [null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 4:\n        return [null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null]\n    case 5:\n        return [null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null]\n    case 6:\n        return [null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null]\n    case 7:\n        return [null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null]     \n    case 8:\n        return [null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null]   \n    case 9:\n        return [null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null]\n    case 10:\n        return [null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null]\n    case 11:\n        return [null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null]\n    case 12:\n        return [null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null]\n    case 13:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null]\n    case 14:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null]\n    case 15:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null]     \n    case 16:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg]\n}\n\n//node.warn(\"zid: \" + zid + \", status: \" + zstatus + \", entities: \" + entity_ids)",
        "outputs": 16,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 270,
        "y": 540,
        "wires": [
            [
                "9022a5b8.478c58",
                "4aa7a1bc.426c9"
            ],
            [
                "a35218ae.d18e28"
            ],
            [
                "60ca2505.845d1c"
            ],
            [
                "df396c28.eef64"
            ],
            [
                "19770ba8.11c6d4"
            ],
            [
                "d8ba25f6.efce58"
            ],
            [
                "dcc747aa.a378b8"
            ],
            [
                "1722acaa.485883"
            ],
            [
                "35d56d5d.bd9c62"
            ],
            [],
            [
                "71d87ba9.be99e4"
            ],
            [
                "d1b097c8.d89308"
            ],
            [
                "964b0753.0aa248"
            ],
            [
                "83bc1403.532158"
            ],
            [],
            [
                "5e02e726.7dddb8"
            ]
        ]
    },
    {
        "id": "9022a5b8.478c58",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "added entity ids",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 600,
        "y": 140,
        "wires": []
    },
    {
        "id": "60ca2505.845d1c",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Garage Door",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Garage Door"
            },
            {
                "property": "device_class",
                "value": "door"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 360,
        "wires": [
            []
        ]
    },
    {
        "id": "6c645525.266eec",
        "type": "debug",
        "z": "ba898990.4dd3e8",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 180,
        "wires": []
    },
    {
        "id": "4aa7a1bc.426c9",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Front Door",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Front Door"
            },
            {
                "property": "device_class",
                "value": "door"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "a35218ae.d18e28",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Sliding Door",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Sliding Door"
            },
            {
                "property": "device_class",
                "value": "door"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 300,
        "wires": [
            []
        ]
    },
    {
        "id": "df396c28.eef64",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Master Bedroom Left Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Master Bedroom Left Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 610,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "19770ba8.11c6d4",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Master Bedroom Right Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Master Bedroom Right Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 610,
        "y": 480,
        "wires": [
            []
        ]
    },
    {
        "id": "d8ba25f6.efce58",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Livingroom Left Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Livingroom Left Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 590,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "dcc747aa.a378b8",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Livingroom Right Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Livingroom Right Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 590,
        "y": 600,
        "wires": [
            []
        ]
    },
    {
        "id": "1722acaa.485883",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Dining Room Left Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Dining Room Left Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 590,
        "y": 660,
        "wires": [
            []
        ]
    },
    {
        "id": "35d56d5d.bd9c62",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Dining Room Right Window",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Dining Room Right Window"
            },
            {
                "property": "device_class",
                "value": "window"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 600,
        "y": 720,
        "wires": [
            []
        ]
    },
    {
        "id": "fac1a046.e2162",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Motion Detector",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Hallway Motion Detector"
            },
            {
                "property": "device_class",
                "value": "motion"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 740,
        "y": 780,
        "wires": [
            []
        ]
    },
    {
        "id": "71d87ba9.be99e4",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Smoke Detector",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Smoke Detector"
            },
            {
                "property": "device_class",
                "value": "smoke"
            },
            {
                "property": "icon",
                "value": "mdi:fire-truck"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 560,
        "y": 840,
        "wires": [
            []
        ]
    },
    {
        "id": "d1b097c8.d89308",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Auxilary Pendant",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Auxilary Pendant"
            },
            {
                "property": "device_class",
                "value": "safety"
            },
            {
                "property": "icon",
                "value": "mdi:shield-home"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 570,
        "y": 900,
        "wires": [
            []
        ]
    },
    {
        "id": "964b0753.0aa248",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Key FOB",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Key FOB"
            },
            {
                "property": "device_class",
                "value": "safety"
            },
            {
                "property": "icon",
                "value": "mdi:shield-home-outline"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 540,
        "y": 960,
        "wires": [
            []
        ]
    },
    {
        "id": "83bc1403.532158",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Key FOB2",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "Key FOB2"
            },
            {
                "property": "device_class",
                "value": "safety"
            },
            {
                "property": "icon",
                "value": "mdi:shield-home-outline"
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 550,
        "y": 1020,
        "wires": [
            []
        ]
    },
    {
        "id": "df4d7e82.5323b",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Panel Motion",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "IQ2 Panel Motion"
            },
            {
                "property": "device_class",
                "value": "motion"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 730,
        "y": 1080,
        "wires": [
            []
        ]
    },
    {
        "id": "5e02e726.7dddb8",
        "type": "ha-entity",
        "z": "ba898990.4dd3e8",
        "name": "Panel Glass Break",
        "server": "934a7469.f8dfc8",
        "version": 1,
        "debugenabled": false,
        "outputs": 1,
        "entityType": "binary_sensor",
        "config": [
            {
                "property": "name",
                "value": "IQ2 Panel Glass Break"
            },
            {
                "property": "device_class",
                "value": "sound"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "unit_of_measurement",
                "value": ""
            }
        ],
        "state": "zstatus",
        "stateType": "msg",
        "attributes": [],
        "resend": true,
        "outputLocation": "",
        "outputLocationType": "none",
        "inputOverride": "allow",
        "x": 570,
        "y": 1140,
        "wires": [
            []
        ]
    },
    {
        "id": "2915e436.c4c6bc",
        "type": "function",
        "z": "ba898990.4dd3e8",
        "name": "Find Active Status \\n Motion Sensors",
        "func": "zid = msg.payload[\"zone\"][\"zone_id\"];\nzstatus = msg.payload[\"zone_event_type\"];\n\nmsg.zstatus = zstatus;\n\nswitch (zid) {\n    case 10:\n        return [msg,null]\n    case 15:\n        return [null,msg]\n}\n\n//node.warn(\"zid: \" + zid + \", status: \" + zstatus + \", entities: \" + entity_ids)",
        "outputs": 2,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 250,
        "y": 700,
        "wires": [
            [
                "5dad6e1b.6c2d4"
            ],
            [
                "6d25094d.78fd58"
            ]
        ]
    },
    {
        "id": "5dad6e1b.6c2d4",
        "type": "change",
        "z": "ba898990.4dd3e8",
        "name": "Define on/off",
        "rules": [
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "ZONE_ACTIVE",
                "fromt": "str",
                "to": "on",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "ZONE_UPDATE",
                "fromt": "str",
                "to": "off",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 550,
        "y": 780,
        "wires": [
            [
                "fac1a046.e2162"
            ]
        ]
    },
    {
        "id": "6d25094d.78fd58",
        "type": "change",
        "z": "ba898990.4dd3e8",
        "name": "Define on/off",
        "rules": [
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "ZONE_ACTIVE",
                "fromt": "str",
                "to": "on",
                "tot": "str"
            },
            {
                "t": "change",
                "p": "zstatus",
                "pt": "msg",
                "from": "ZONE_UPDATE",
                "fromt": "str",
                "to": "off",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 550,
        "y": 1080,
        "wires": [
            [
                "df4d7e82.5323b"
            ]
        ]
    },
    {
        "id": "934a7469.f8dfc8",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    }
]

EDIT: One problem I’ve noticed with the motion sensor is that it will report Zone_Active/Zone_update every ~64 minutes on it’s own. The JSON the IQ2 panel spits out seems to be indistinguishable between these regular updates and an actual motion detected event.

I’m not sure if it’s a problem with that specific motion sensor model? Having a false motion event every 64mins might mean I can’t rely on it for any automations.

The other useful bit of information that shows up in the JSON is the disarmed/armed away/armed stay status. That should be easy to pull, I just need to figure out how to make a sensory with 3 states.

1 Like

If anyone is interested developing this integration further and would like the decrypted IQ2 panel drivers PM me

I only wish I has the development knowledge to contribute, but I am really interested in this myself.

What are the drivers?

Is there a way to talk to you about node-red? I’m working to try and get the iq panel 2 to work with smart things also and need some help.

These are the IQ2 panel drivers for the C4 panel mentioned above. Currently that’s the only official IQ2 Integration. The drivers might be useful in writing an integration. The NodeRed solution works ok for listening, but there are a few things that could be improved. The flow will occasionally stop responding, require a NodeRed restart.

I’m using the NodeRed / HomeAssistant Integration. I don’t know a lot about NodeRed, I have it running well enough that it’s acceptable.

Are you using SmartThings with HomeAssistant or are you using SmartThings with NodeRed directly?

Thank you for all your work on this, y’all. I recently bought a house with this panel installed, and although I scoffed at it at first, it’s cool that this is all possible and I’m warming up to the idea of keeping it in place. After scouring through this thread I was able to get Jason’s flow working perfectly quite quickly.

Weirdly, I don’t seem to be having the same issues you did with the motion detector. I changed the Source like you said, but after checking Home Assistant I appear to have been getting signals from before that. I switched it back to S-Line and am still getting updates. I also didn’t use your newer version with the second fuction, but I seem to be getting normal behavior without it so I’ll leave it for now.

At this point, with the ability to monitor these devices, the panel is so close to being ACTUALLY useful… the final piece at this point would be to simply sideload the HA .apk to the device somehow… or even just default it to a web view that would show HA as the main interface… puts thinking cap on

I can’t find any results on Google about successfully using adb on this thing but I might give it a shot.

If you try to connect to https://ip_of_panel:8883 it’s requesting a certificate to connect.

I think I found the key to decrypt the driver.

So I was able to get into the driver, and the best that I can tell, the IQ panel 2 sends and receives commands over the 12345 port even from the C4 driver. I need some help from someone that can help me deconstruct the driver a bit more to understand how it sends the commands and potentially someone that can help develop a plugin for Home Assistant to directly connect and control the panel without Node-red.
------------Addition---------
So I think I’ve figured out a little more looking through the driver. I still haven’t figured out exactly what URL the commands are sent to, but it does appear that they are sent to https://ip_address:12345. The information that is sent to the IQ2 appears to be in a json format, and in the driver there are examples of the json information that is passed to the panel for actions but here is some relevant functions.

function ApplyQolsysFields(payload)
    payload[VERSION_KEY] = 1
    payload[SOURCE_KEY] = 'C4'
    payload[TOKEN_KEY] = Properties["Token"]
end

function RequestSummary(nonce)
    --'{"partition_id": 0, "action": "INFO", "info_type": "SUMMARY", "version": 0, "source": "C4"}'
    local ReqInfo = {}
    ReqInfo[NONCE_KEY] = nonce or ""
    ReqInfo[ACTION_KEY] = INFO_VAL
    ReqInfo[INFO_TYPE_KEY] = SUMMARY_VAL
    ApplyQolsysFields(ReqInfo)
    SendCommand(C4:JsonEncode(ReqInfo))
end

The RequestSummary function mirrors the other functions like sending an arming/disarming command. Now please excuse me in this, I am more of a sys admin and not a developer. In RequestSummary it looks like it builds an array called ReqInfo of information that needs to be passed to the IQ panel, then it gets passed to the ApplyQolsysFields to the ReqInfo array, this I believe is where it apply the “Token” that you obtain from the panel.

What I don’t know is how all of this would be formatted and sent (with curl?) to the panel to activate that function.