Qolsys IQ Panel 2 and 3rd party integration

It’s possible that adding a zwave radio to HA that HA can function as a secondary controller.

That’s what I’m hoping. Two different revs of SmartThings hubs work fine as secondaries, and I have a Aeotec Z-stick that also works fine, using the SiLabs “Z-Wave Programmer” application. So I’m confident that the QolSys panel works as expected when including a correctly implemented secondary.

Was hoping this newly found interface might be an alternative, but if Control 4 has a properly implemented z-wave system, then I suppose it makes sense for it to connect as a secondary to the QolSys.

For me it can work for a week before I have to restart NodeRed. I’ve added the keepalive command, so I’ll see if it makes a difference.

Qolsys has said that the only integration is with C4, though they did mention another expensive home automation system integration coming soon.

Another place to look for functions other than the driver might be the rom that Mzac mentioned above.

There are two other options listed on my panel under 3rd party Wifi connections. One is Savant which appears to be another high end ha system, and the other is Home Accessories which I haven’t found any info on.

I’m not an Android programmer, so that’s a bit outside my area of expertise.

Mzac and I are going to dig into the firmware/rom and see if we can find anything else in there.

I just tried my JSON command again. {“nonce”:"",“action”:“INFO”,“info_type”:“SUMMARY”,“version”:0,“source”:“C4”,“token”:“TOKEN”} and it worked for me.

You could possibly try it this way.
{“nonce”:"",“action”:“INFO”,“info_type”:“SUMMARY”,“version”:0,“source”:“C4”,“version_key”: 1,“source_key”: “C4”,“token”:“TOKEN”}

Hi everyone, I figured out a small python script to get the status of the panel and send it to MQTT. This is work in progress but it works! You’ll need to install the paho-mqtt module for it to work.

Once the data is in MQTT, you can probably read it with Home assistant (not there yet but should be easy)

#!/usr/bin/python3

import json
import socket
import ssl
import sys
import time

import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish

# Qolsys Parameters
qolsysPanel     = "<panel ip/host>"
qolsysPort      = 12345
qolsysToken     = "<token>"
qolsysTimeout   = 20

# MQTT Parameters
mqttServer      = "<mqtt server>"
mqttPort        = 1883
mqttUser        = "<mqtt user>"
mqttPass        = "<mqtt pass>"
mqttTopic       = "/qolsys"

################################################################################
# Code
mqttAuth = {
    'username':mqttUser, 
    'password':mqttPass
}

publish.single(mqttTopic + "/status", "Qolsys Client Starting", hostname=mqttServer, port=mqttPort, auth=mqttAuth)

statusString    = {
                    "nonce":        "test",
                    "action":       "INFO",
                    "info_type":    "SUMMARY",
                    "version":      0,
                    "source":       "C4",
                    "token":        qolsysToken,
                }

def main():
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(qolsysTimeout)
    except socket.error:
        print('Could not create a socket')
        sys.exit()

    # Wrap SSL
    wrappedSocket = ssl.wrap_socket(sock, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_TLSv1_2)

    # Connect to server
    try:
        wrappedSocket.connect((qolsysPanel, qolsysPort))
    except socket.error:
        print('Could not connect to server')
        sys.exit()
    
    # Send message and print reply
    online = True
    while online:
        wrappedSocket.send((json.dumps(statusString)).encode())
        while True:
            response = wrappedSocket.recv(4096).decode()
            if is_json(response):
                print(response)
                publish.single(mqttTopic + "/message", response, hostname=mqttServer, port=mqttPort, auth=mqttAuth)
            break  # stop receiving
        time.sleep(qolsysTimeout / 4)

def is_json(myjson):
    try:
        json_object = json.loads(myjson)
    except ValueError as e:
        return False
    return True

# Start client
main()
1 Like

Yes C4, and Savant is the future integration Qolsys mentioned, I couldn’t remember the name.

Does using the token to connect to the panel to disarm the panel bypass the need for the PIN number?

No, the token is to authenticate that the command it is receiving is valid, there is a userID field that is also passed in the commands. While I’m not 100% sure that a code has to be sent during the disarm, during some of my testing, I did get a message on the panel of invalid user for disarm, so I’m assuming that a user pin needs to be passed for disarming. Wouldn’t be a bad idea to setup a “HA” user pin code for tracking purposes.

Hey everyone,

I started to build a ‘very simple’ python module to talk with the panel. I am no python expert, I’m just a beginner so if you want to help contribute to make this module good, better and work and maybe eventually be the backend for a Home Assistant integration, please do!

Source is here:

Python module is here:

There is a demo.py in the code that shows how to use the module

3 Likes

Anyone know if there is a way to dynamically add nodes in node-red? I’m thinking that I could send an info summary request, then for each zone it returns to create a node for that sensor?

I’m not sure about auto populating nodes, I’m using the HA integration which allowed me to create a node for each sensor that then gets automatically added as an entity to HA.

The advantage of manually creating the nodes is that it allows me to name each entity and specify its HA device class. You might be ok pulling and using the names on your panel, device class I don’t know.

By the way, is that keep alive command working for you? I had to reboot NodeRed today to re-establish a connection.

Are you running the latest version of NodeRed? I’ve had the QolSys monitoring flow running for 4+ days now with no problems or interruptions. I’m running 1.29 in a Docker container on my Synology NAS.

Yes, I’m running the latest version of NodeRed from Supervisor in HA on Virtual Box. The connectivity issue is unpredictable, it could be a day or over a week before losing the connection. At least 3 other people have reported the same behavior in this thread so it appears to be a common issue. Let me know when you go two weeks without an issue lol.

Is there a way for NodeRed to detect when the websocket connection is lost, and then reconnect?

If I experience the connection loss, I’ll definitely look into that. There’s probably a few different ways you could do about it. The panel emits status messages fairly frequently, but I imagine that depends on how many devices you have.

You could set a timestamp every time a message comes in, and periodically check that. In my case I get a message at least once a minute, but whatever the proper interval, if you don’t detect anything then kill and restart the curl command.

You could also check the exit code from the curl command, which you should never get unless curl exits which normally shouldn’t be the case. So if an exit command is detected, restart the flow.

Now, if you really have to restart NodeRed in order to get things moving again, you’d need some external watchdog.

I’m actually rewritting the node-red to use openssl instead of curl, it does seems to be working a bit better.

One issue that I’m seeing, and maybe someone can help me out with this. When sending a arm stay or disarm command, it works perfectly. However, when sending an arm away command, it goes through the countdown and shows that it was armed away, however, once the count down is done, it swaps over to arm stay.

this is the command I’m sending.

{"partition_id":0,"action":"ARMING","arming_type":"ARM_AWAY","version":0,"nonce":"","usercode":"XXXX","source":"C4","version_key":1,"source_key":"C4","token":"XXXXXXX"}

{"version_key":1,"source_key":"C4","token":"XXXXXX","partition_id":0,"action":"ARMING","arming_type":"ARM_AWAY","bypass":false,"version":0,"nonce":"","source":"C4","delay":60}

and a few others.

Now the nonce key is used between C4 and Qolsys so that C4 knows what panel to send the message back to, so the nonce is not needed in this aspect as all it does is send the nonce value back in the reply message.

Anyone want to help me figure out how to actually get it to arm away?

Might be able to do some testing later tonight, after my wife goes to bed. She would set off the alarm if I armed it during the day because of the motion sensors.

Hey guys, try this flow and see if it works for you.

I can also get a homebridge flow if anyone needs it.

[{"id":"f56bc79f.7f2488","type":"tab","label":"Monitor QolSys Panel for HomeAssistant","disabled":false,"info":""},{"id":"a1d01192.4adf6","type":"debug","z":"f56bc79f.7f2488","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":"955f5912.5939f8","type":"debug","z":"f56bc79f.7f2488","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":500,"y":20,"wires":[]},{"id":"d32460c3.8baeb","type":"debug","z":"f56bc79f.7f2488","name":"converted json","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":740,"y":240,"wires":[]},{"id":"29570e98.3853a2","type":"function","z":"f56bc79f.7f2488","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,null,msg]\n    case 2:\n        return [null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg]\n    case 3:\n        return [null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg]\n    case 4:\n        return [null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null,null,msg]\n    case 5:\n        return [null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null,null,msg]\n    case 6:\n        return [null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null,null,msg]\n    case 7:\n        return [null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null,null,msg]     \n    case 8:\n        return [null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null,null,msg]   \n    case 9:\n        return [null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null,null,msg]\n    case 10:\n        return [null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null,null,msg]\n    case 11:\n        return [null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null,null,msg]\n    case 12:\n        return [null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null,null,msg]\n    case 13:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null,null,msg]\n    case 14:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null,null,msg]\n    case 15:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null,null,msg]     \n    case 16:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg,null,msg]\n    case 17:\n        return [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,msg,msg]\n}\n\n//node.warn(\"zid: \" + zid + \", status: \" + zstatus + \", entities: \" + entity_ids)","outputs":18,"noerr":0,"initialize":"","finalize":"","x":430,"y":620,"wires":[["b4675df.7b8a9a"],["260014ef.9e567c"],["e0751b3.833ece8"],["78a6cb10.642ac4"],["a7ac8fa2.72b01"],["ce833c23.43ab"],["e0461607.b350a8"],["944cfab2.77e848"],["c94a3d7a.b88d9"],["a4ee01f4.2ce31"],["b4f795b2.f247e8"],["ce8fc1bd.5e2bf"],["ec8a532d.f7ea"],["19174477.0c786c"],["e4415c23.d422"],["9cabcac4.5eac38"],["2179415c.b6e4be"],["378a979c.bb7f58"]]},{"id":"378a979c.bb7f58","type":"debug","z":"f56bc79f.7f2488","name":"added entity ids","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":620,"y":1200,"wires":[]},{"id":"b4675df.7b8a9a","type":"ha-entity","z":"f56bc79f.7f2488","name":"Front Door","server":"7ce906e3.693188","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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":990,"y":340,"wires":[[]]},{"id":"b7dbdb6c.239808","type":"ha-entity","z":"f56bc79f.7f2488","d":true,"name":"Motion Detector","server":"7ce906e3.693188","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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":460,"y":900,"wires":[[]]},{"id":"5ae77b36.22b6b4","type":"ha-entity","z":"f56bc79f.7f2488","d":true,"name":"Panel Motion","server":"7ce906e3.693188","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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":430,"y":1040,"wires":[[]]},{"id":"26a17e23.b68c02","type":"function","z":"f56bc79f.7f2488","d":true,"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":150,"y":880,"wires":[["8cfceb8f.5d73a8"],["3a759b21.164164"]]},{"id":"8cfceb8f.5d73a8","type":"change","z":"f56bc79f.7f2488","d":true,"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":430,"y":860,"wires":[["b7dbdb6c.239808"]]},{"id":"3a759b21.164164","type":"change","z":"f56bc79f.7f2488","d":true,"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":430,"y":980,"wires":[["5ae77b36.22b6b4"]]},{"id":"260014ef.9e567c","type":"ha-entity","z":"f56bc79f.7f2488","name":"Back Door","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Back 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":990,"y":400,"wires":[[]]},{"id":"e0751b3.833ece8","type":"ha-entity","z":"f56bc79f.7f2488","name":"Laundry Door","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Laundry 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1000,"y":460,"wires":[[]]},{"id":"78a6cb10.642ac4","type":"ha-entity","z":"f56bc79f.7f2488","name":"Den Door","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Den 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":980,"y":520,"wires":[[]]},{"id":"a7ac8fa2.72b01","type":"ha-entity","z":"f56bc79f.7f2488","name":"Dining Room Window 1","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Dining Room Window 1"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1030,"y":580,"wires":[[]]},{"id":"ce833c23.43ab","type":"ha-entity","z":"f56bc79f.7f2488","name":"Dining Room Window 2","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Dining Room Window 2"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1030,"y":640,"wires":[[]]},{"id":"e0461607.b350a8","type":"ha-entity","z":"f56bc79f.7f2488","name":"Den Window 1","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Den Window 1"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1000,"y":700,"wires":[[]]},{"id":"944cfab2.77e848","type":"ha-entity","z":"f56bc79f.7f2488","name":"Den Window 2","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Den Window 2"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1000,"y":760,"wires":[[]]},{"id":"c94a3d7a.b88d9","type":"ha-entity","z":"f56bc79f.7f2488","name":"Den Window 3","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Den Window 3"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1000,"y":820,"wires":[[]]},{"id":"a4ee01f4.2ce31","type":"ha-entity","z":"f56bc79f.7f2488","name":"Kitchen Window","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Kitchen 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1000,"y":880,"wires":[[]]},{"id":"b4f795b2.f247e8","type":"ha-entity","z":"f56bc79f.7f2488","name":"Cooper's Window","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Cooper's 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1010,"y":940,"wires":[[]]},{"id":"ce8fc1bd.5e2bf","type":"ha-entity","z":"f56bc79f.7f2488","name":"Hannah's Window 1","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Hannah's Window 1"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1020,"y":1000,"wires":[[]]},{"id":"ec8a532d.f7ea","type":"ha-entity","z":"f56bc79f.7f2488","name":"Hannah's Window 2","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Hannah's Window 2"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1020,"y":1060,"wires":[[]]},{"id":"19174477.0c786c","type":"ha-entity","z":"f56bc79f.7f2488","name":"Master Bath Window","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Master Bath 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1020,"y":1120,"wires":[[]]},{"id":"e4415c23.d422","type":"ha-entity","z":"f56bc79f.7f2488","name":"Master Bedroom Window","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Master Bedroom 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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1030,"y":1180,"wires":[[]]},{"id":"9cabcac4.5eac38","type":"ha-entity","z":"f56bc79f.7f2488","name":"Living Room Window 1","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Living Room Window 1"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1030,"y":1240,"wires":[[]]},{"id":"2179415c.b6e4be","type":"ha-entity","z":"f56bc79f.7f2488","name":"Living Room Window 2","server":"7ce906e3.693188","version":1,"debugenabled":false,"outputs":1,"entityType":"binary_sensor","config":[{"property":"name","value":"Living Room Window 2"},{"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","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1030,"y":1300,"wires":[[]]},{"id":"95ecfaf1.e179d8","type":"inject","z":"f56bc79f.7f2488","name":"go","props":[],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":90,"y":20,"wires":[[]]},{"id":"7f0292a5.b336ac","type":"json","z":"f56bc79f.7f2488","name":"convert update to json","property":"payload","action":"","pretty":true,"x":380,"y":300,"wires":[["29570e98.3853a2","26a17e23.b68c02","d32460c3.8baeb"]]},{"id":"6aefec2c.bdf514","type":"daemon","z":"f56bc79f.7f2488","name":"","command":"openssl","args":"s_client -host 192.168.7.1 -port 12345","autorun":true,"cr":false,"redo":true,"op":"lines","closer":"SIGKILL","x":160,"y":120,"wires":[["5595fe81.9b7fc"],[],[]]},{"id":"5595fe81.9b7fc","type":"switch","z":"f56bc79f.7f2488","name":"Filter Key information","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"ACK","vt":"str"},{"t":"cont","v":"{","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":360,"y":200,"wires":[[],["7f0292a5.b336ac"],[]]},{"id":"7ce906e3.693188","type":"server","name":"Home Assistant","legacy":false,"addon":false,"rejectUnauthorizedCerts":false,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

You will need the node-red-node-daemon for this flow.

Hi Michael,

I’m trying to test your flow in HA node-red, but for some reason I wasn’t able to get any response from the panel.

Running openssl command directly on the console, here is the only message that I get.

pi:~ $ openssl s_client -host 192.168.0.45 -port 12345
CONNECTED(00000003)

Any ideas?

You don’t see the crypto information after the connection?