Requesting binding for GE/Caddx/Interlogix/UT NX-8E / NX-584 Alarm Panel

This alarm panel has been around for many years under a variety of vendors – should be very popular. Currently, it is under Interlogix/United Technologies. It presents a serial interface to allow polling of partitions and zones, among other actions. USB to serial adapters also work.

I know there are plug-ins for other home automation controllers, Micasaverde, for example.

I am a programmer – if I can make the time, I could probably do this with some guidance from openHAB gurus.



I’ve implemented the GE protocol as a standalone web server that talks to the RS-232 automation module. I use the Concord 4 but the module works for many of the Interlogix models. I’d also like to build an OpenHab binding for this system. I can contribute what I have.


Looks like the protocols are similar but not the same, unfortunately

I would be extremely interested as I recently had a GE Concord system installed. I would also be willing to help where possible as my background is development. Have you posted your stand alone web app anywhere?

Why do not interact with this system using nx595e board?

I’m not familiar with the protocol for interacting with this board. A quick search shows that this board is for reporting to a central station via IP.

I found this project for the NX-584; someone has already developed an OH2 binding it would appear.

I also have a NX-8E panel but I use the NX-586E module to connect to openhab. It’s basically a virtual keypad and it’s fairly cheap. My panel already had a serial port for home automation but it spits out what looks like random characters that you have to interpret to figure out what it’s saying. You also have to format commands to the panel a certain way. The NX-586E spits out status to a “coded” string also but it’s 1001% easier to decipher. It’s so easy and reliable i’m not sure a dedicated binding is required. Especially when the binding requires rules to function (looks like the binding in the last link posted uses rules).

What I did (and my suggestion), I basically created a software controller for the panel. I have a pre-existing VM infrastructure so I made my controller virtual but a raspberry pi would be perfect for this use and you can likely power it with the panel. I’m using openhab to connect to the NX-586E and map the output to MQTT topics. This OH instance consist of the serial, mqtt, ntp, mysql binding for persistence, one items file, and one rules file so it’s very simple and light weight. So I’ve basically turned the panel into a network device by mapping REST and MQTT to the various functions of the NX-586E.

Why use a separate OH instance? Because it’s a security device!! By using a dedicated instance for this interface I was able to lock this device down pretty tight. For example you need a cert to SSH to the centos operating system, my switch features port security which is enabled for this server, and i’m able to easily log EVERYTHING this server does for what is essentially forever because i’m not rotating them at all and I have to plans to. If all that wasn’t enough, the server is on a dedicated Vlan and the routes are basically deny everything, in or out, except for my MQTT server. When I need to log into the server (which is highly rear) I enable a rule on my firewall to let my laptop through to port 22, 21, 443, and MQTT(mqtt port is slipping me right now). I also used this method to limit the commands I can send to the panel. The only MQTT topics the panel is subscribe to is for the arm and stay buttons. Maybe one day i’ll open up full 2-way communication but at this point there is zero need for openhab to disarm or bypass zones on my panel. What all of this does is from the outside(outside the environment of the panel not necessarily my house) if i were compromised someone can’t sit there and randomly guess at the pin(s) until it disarms. Just keep in mind that if you’re going to integrate your panel (maybe any panel), since there is no bruit force security on the panel(at least not that i’m aware of) it would be relatively easy for someone write a program to cycle through all 6 digits to guess at a pin, and if you’re only using 4 digit pins… good lord! If you’ve integrated your door locks to the panel and since your IP address can be relatively easily traced to a physical address, it makes the threat a little more real.

Just in case anyone is interested here are my item and rule files. It’s truncated but you’ll get the idea. Might want to go through it carefully if you’re going to use them since I did a mass find and replaces to change some names to protect the innocent. Also, my disclaimer, this is one of the first rules and item files I ever created in OH. The rules can likely be cleaned up a ton but it’s inefficiencies do not affect me at the moment. What I didn’t mention before is that i’m using specifically the eventbus portion of the MQTT binding. The eventbus is configured to publish all updates and commands to the subscription topics. So when a zone changes my other OH sees it as a command and I don’t have to setup each individual item to a MQTT topic. The only items that require special binding information are items i’d want to control the panel. You’ll notice that a lot of the items have MQTT binding info attached. You can likely just remove or comment those out. My OH setup is a bit different than most(i’m assuming), I actually have 9 OH instances running and there’ll be more by the time i’m done. These items are what I call sensitive items and they’re additionally publishing to “global” topics that all instances subscribes to so I know the message regarding it’s state was absolutely received by all devices. Obviously, since this OH instance is plugged directly into the NX-586E it can send any command it wants to the panel. This is acceptable for me as I have a ton of security around the server itself. The server is not configured to relay external commands to the panel and you’ll require physical access to the server to make that change. Follow this way of thinking and you should be safe, in theory…

I know this topic was started for a request for a binding, but I guess my point is I don’t think it’s necessary (IMHO) at all. Respectfully, the time spent on that can be used doing other, cooler things. But just in case someone does it anyway and it’s awesome, subscribing to this thread.

Item file:

Group	Fire
Group	NX8ESensors
Group	NX8E_ExteriorDoors

String	NX8E_Panel	"Security System [%s]"	(Security)	{serial="/dev/ttyS1"}
Switch	NX8E_Arm	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	NX8E_Arm_Proxy	"Virtual Keypad"	(Security)	{mqtt="<[MainHouse:/security/state/arm/command:command:default],>[MainHouse:/security/state/arm/state:state:*:default]"}
Switch	NX8E_DisArm	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	NX8E_Away	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	NX8E_Ready	"Virtual Keypad"	(Security)
Switch	NX8E_Power	"Virtual Keypad"	(Security)
Switch	NX8E_Stay	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
String	NX8E_Stay_Status	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:*:default]"}
Switch	NX8E_ComingSystem	"Virtual Keypad"	(Security)
Switch	NX8E_Exit	"Virtual Keypad"	(Security)
Switch	NX8E_Cancel	"Virtual Keypad"	(Security)
Switch	NX8E_Fire	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	NX8E_Medical	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	NX8E_Police	"Virtual Keypad"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
String	NX8E_Display1	"Virtual Keypad"	(Security)
String	NX8E_Display2	"Virtual Keypad"	(Security)
Switch NX8E_ExteriorDoors_Status	"Exterior Doors"	(Security)
Switch	NX8E_1	"Virtual Keypad"	(Security)
Switch	NX8E_2	"Virtual Keypad"	(Security)
Switch	NX8E_3	"Virtual Keypad"	(Security)
Switch	NX8E_4	"Virtual Keypad"	(Security)
Switch	NX8E_5	"Virtual Keypad"	(Security)
Switch	NX8E_6	"Virtual Keypad"	(Security)
Switch	NX8E_7	"Virtual Keypad"	(Security)
Switch	NX8E_8	"Virtual Keypad"	(Security)
Switch	NX8E_9	"Virtual Keypad"	(Security)
Switch	NX8E_0	"Virtual Keypad"	(Security)
Switch	Door_Foyer	"Foyer Door"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Door_Kitchen	"Kitchen Door"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Door_KitchenSlider	"Kitchen Slider"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Door_TVRoom	"TV Room Door"	(Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Motion_Kitchen	"Kitchen Motion"	(Security)
Switch	Motion_Kitchen1	"Kitchen1 Motion"	(Security)
Switch	Motion_FamilyRoom	"Family Room Motion"	(Security)
Switch	Motion_TVRoom	"TV Room Motion"	(Security)
Switch	Motion_MasterBedRoom	"Master BedRoom Motion"	(Security)
Switch	Motion_Hallway_SF	"Hallway Second Floor Motion"	(Security)  {mqtt=">[MainHouse:/sfhallway/sensors/motion/command:command:*:default]"}
Switch	Smoke_Kitchen	"Kitchen Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_Kitchen1	"Kitchen1 Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_FamilyRoom	"TV Room Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_Foyer	"Foyer Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_MasterBedRoom	"Master BedRoom Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_Hallway_SF	"Second Floor Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_Kayden	"Kayden Room Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}
Switch	Smoke_Korey	"Korey Room Smoke Detector"	(Fire,Security)	{mqtt=">[MainHouse:/System/Broadcast:command:ON:${itemName} Is now ${command}],>[MainHouse:/System/Broadcast:command:OFF:${itemName} Is now ${command}]"}


var String Security_buffer = ""

//*********** System Status **********//
rule "Security Keypad Update"
        System started or
        Time cron "0 */1 * * * ?"
 logInfo("SecurityStatus", "Keypad Query")
	sendCommand(NX8E_Panel, "Q000")

rule "NX8E_Panel Sensors Update"
        System started or
        Time cron "0 */1 * * * ?"
 logInfo("NX8E_PanelStatus", "Sensor Query")
	sendCommand(NX8E_Panel, "Q201")
	sendCommand(NX8E_Panel, "Q033")
	sendCommand(NX8E_Panel, "Q034")
	sendCommand(NX8E_Panel, "Q035")
	sendCommand(NX8E_Panel, "Q036")
	sendCommand(NX8E_Panel, "Q009")
	sendCommand(NX8E_Panel, "Q010")
	sendCommand(NX8E_Panel, "Q011")
	sendCommand(NX8E_Panel, "Q012")
	sendCommand(NX8E_Panel, "Q013")
	sendCommand(NX8E_Panel, "Q014")
rule "NX8E_Panel Output Defaults"
        System started or
        Time cron "0 0 */13 * * ?"
 logInfo("NX8E_PanelStatus", "Setting CLI Output Defaults")
	sendCommand(NX8E_Panel, "T")
	sendCommand(NX8E_Panel, "a")
	sendCommand(NX8E_Panel, "I")
	sendCommand(NX8E_Panel, "P")
	sendCommand(NX8E_Panel, "Z")
	sendCommand(NX8E_Panel, "n")
	 logInfo("NX8E_PanelStatus", "Complete CLI Output Defaults")
//******** System Status  **********//
rule "NX8E Status"
        Item NX8E_Panel received update or
        System started
 NX8E_Panel_buffer = NX8E_Panel_buffer + NX8E_Panel.state.toString.trim
println("NX8E_Panel_buffer -> " + NX8E_Panel_buffer)

// Conditions start here ///
// *******SYSTEM STATUS ***************** //
        if(NX8E_Arm.state != ON){
        if(NX8E_Stay.state != ON){
if(NX8E_Panel_buffer.contains("System Armed")){
		if(NX8E_DisArm.state != OFF){
        if(NX8E_Arm.state != OFF){
if(NX8E_Panel_buffer.contains("Type code to arm")){   
        if(NX8E_DisArm.state != ON){
   	    if(NX8E_Stay.state != OFF){
		if(NX8E_Ready.state != OFF){
 }} else
		if(NX8E_Ready.state != ON){
  // *******PANEL POWER STATUS ****************** //
        if(NX8E_Power.state != ON){
 }} else 
        if(NX8E_Power.state != OFF){
  //******* Door Sensors ************
		if(Door_Kitchen.state != OFF){
  }} else
		if(Door_Kitchen.state != ON){
		if(Door_KitchenSlider.state != OFF){
  }} else
		if(Door_KitchenSlider.state != ON){
		if(Door_Foyer.state != OFF){
  }} else
		if(Door_Foyer.state != ON){
		if(Door_TVRoom.state != OFF){
 }} else
		if(Door_TVRoom.state != ON){
 // *******MOTION DETECTOR STATUS ****************** //
 		if (Motion_TVRoom.state != ON){
   sendCommand(Motion_TVRoom, ON)
  }} else
 		if (Motion_TVRoom.state != OFF){
   sendCommand(Motion_TVRoom, "OFF")
 		if (Motion_FamilyRoom.state != ON){
   sendCommand(Motion_FamilyRoom, "ON")
 }} else
 		if (Motion_FamilyRoom.state != OFF){
   sendCommand(Motion_FamilyRoom, "OFF")
 		if (Motion_Kitchen.state != ON){
   sendCommand(Motion_Kitchen, "ON")
 }} else
 		if (Motion_Kitchen.state != OFF){
   sendCommand(Motion_Kitchen, "OFF")
 		if (Motion_Kitchen1.state != ON){
   sendCommand(Motion_Kitchen1, "ON")
 }} else
 		if (Motion_Kitchen1.state != OFF){
   sendCommand(Motion_Kitchen1, "OFF")
 		if (Motion_MasterBedRoom.state != ON){
   sendCommand(Motion_MasterBedRoom, "ON")
 }} else
 		if (Motion_MasterBedRoom.state != OFF){
   sendCommand(Motion_MasterBedRoom, "OFF")
 		if (Motion_Hallway_SF.state != ON){
   sendCommand(Motion_Hallway_SF, "ON")
 }} else
 		if (Motion_Hallway_SF.state != OFF){
   sendCommand(Motion_Hallway_SF, "OFF")
NX8E_Panel_buffer = ""
//*****  SYSTEM INTERACTION ***********//
rule "Alexa Arming"
//	Time cron "0 */1 * * * ?"
	Item NX8E_Arm_Proxy received command ON
//	if(NX8E_Arm_Proxy.state == ON){
		sendCommand(NX8E_Panel, "S")
		logInfo("NX8E_PanelStatus", "Alexa Arming")
//	}
rule "Exterior Doors"
	Item NX8E_ExteriorDoors received update or
	System started
    if(NX8E_ExteriorDoors.members.filter(s | s.state == ON).size > 0){
    	if(NX8E_Away.state == ON){
    if(NX8E_ExteriorDoors.members.filter(s | s.state == ON).size == 0){
rule "NX8E Stay Status"
	Item NX8E_Stay received update or
	System started
rule "NX8E_Stay_Status Initialize"
	System started or
    Time cron "0 */5 * * * ?"
	if (NX8E_Stay_Status.state.toString.matches ("1") || NX8E_Stay_Status.state.toString.matches ("0")|| NX8E_Stay_Status.state.toString.matches ("Uninitialized")) {
    	sendCommand(NX8E_Stay_Status, ("Inactive"))
rule "House Status"
	Item NX8E_Arm received update or
	System started
		if(NX8E_Arm.state==ON && NX8E_Stay.state == OFF){
			logInfo("NX8E_PanelStatus", "System Status CHANGED, AWAY DETECTED - Time out STARTED")
			var Timer alarmTimeout
				alarmTimeout = null}
			alarmTimeout = createTimer(now.plusMinutes(1)) [|
				logInfo("NX8E_PanelStatus", "System Status CHANGED, AWAY DETECTED")
				if(NX8E_Arm.state==ON && NX8E_Stay.state == OFF){
					logInfo("NX8E_PanelStatus", "System Status CHANGED, State is AWAY")
		if(NX8E_Arm.state==ON && NX8E_Stay.state == ON){
			logInfo("NX8E_PanelStatus", "System Status CHANGED, State is Stay")
			logInfo("NX8E_PanelStatus", "System Status CHANGED, State is Stay")

Thanks @sc1982 for the info on your application. If I’m not mistaken, the NX-586E is essentially an RS-232 to RS-485 bridge with some added features like non-volatile storage for 4 panel configurations.

The automation interface protocol (available on the NX-8E and NX-584 serial ports) is indeed different from the keypad protocol. I would say that the automation protocol is ideal for my purposes, as I am not interested in control of the panel but rather monitoring of the contacts and sensors. For example as an occupancy determinant or to know if my garage doors are open. I also have smoke/heat detectors on my panel and these can report to OpenHAB like any other sensor. My application is read-only. In fact, the panel can be configured to disallow arming and disarming via the automation interface, as I have done. I want to keep the security system off the Internet.

I have installed the binding by @Bernhard_Boser and it works very well. I’m working out some kinks but love that it supports query/response and event messages.

I’ll review your application described in your last posts and see if it applies to my uses.

I believe you’re correct about the NX-586E. I’m not sure on the technicalities of how it works but that sounds right. There are 2 attributes that I believe is D1 and D2, these two display in clear text exactly what you would see on a keypad. I think these two attributes alone is gold.

I get your point. Sometimes I almost (only almost) think there’s to many ways to accomplish the same thing. Got to figure out what works best for you. But so we’re clear, we’re essentially doing the same thing. I’d rather not have OH controlling my panel either but I see a benefit in remote arming. So I’m using the PIRs and detectors on my panel to automate my lights, heat, various other modes, etc. Also, as you’ll see above, I’m also making up my own statuses by running rules against the keypad led status lights.

Please please provide feed back on the binding. I’m always open to improvements. I definitely don’t know everything… sometimes anything (HA!).

Are you sure you mean NX-586E and not NX-587E ? The later is a virtual key pad, the first is for uploading/downloading panel configurations. I just got the NX-586e and cannot read any data from it. Using serial->usb cable using kermit /dev/ttyUSB0.

Any tips are welcome.


Have you configured & enabled your panel’s automation port? Have you an NX-8E?

You’ll first have to do so via your keypad. Search the Internet for “programming nx8e automation port.”

Thanks for your reply Paul. Yes i’ve a NX-8E board. Why do I need to enable the automation port? The NX-586E is supposed to emulate a keypad according to sc1982. I’ve it connected with the clipons on POS/COM/… Do I need the program code for this ?

Thanks in advance,

You are correct. I misspoke. If you’re trying to use @bboser’s binding, I don’t know if it works with the NX-586E. I believe that has a different protocol than does the automation port of the NX-8E or the NX-584. I have had good results with the automation port and the binding. See post #6

If you want to go the route that @sc1982 has, I defer to his post. As for more background on this panel and the NX-586E, you might go here: Look under the forum for Caddex (sic) as Caddx was the original company that developed these. Then GE bought them followed by Interlogix and United Technologies.

I’m not sure what I was on when I typed NX-586E but I apologize deeply!! I’m very sorry if I caused anyone to spend money on a part they didn’t need!!

I have an NX-587E and it is a serial based virtual keypad to the NX8e panel. I’m not sure if the automation port settings on the panel needs to be enabled. I checked my panel and my home automation settings are all enabled. However before I got the NX-587E i tried the onboard serial port with no luck. I may have forgotten to disable the automation settings but I just can’t shake this feeling that it was required for the NX-587E. I can’t logically think of why it would be required though as i’m pretty sure the panel sees this thing as a secondary keypad and not an automation interface. You should play around with it and post back the results so others can benefit. If I get a chance to setup a maintenance window i’ll play around with mine and let you know. Don’t hold your breath though, If you can get to it do it yourself. I don’t like randomly making changes to systems that’s been working untouched for years. I’m also drowning in a back log of things to do at the moment, it’ll be like 2-3 weeks before I can even think about it. This panel has been so reliable that every time I touch it I have to reread the manual because it’s been so long I don’t remember anything about how to navigate the menu.

Thanks for the updated info. The NX-587E is as you say, a virtual keypad. You wire it to the panel as if it were another keypad. Terminals KP COM, KP DATA & KP POS. The serial communications are preset.

This is not the same automation protocol and does not use the automation port on the panel. The serial port on mine was a 10-pin header.

When you do get to mess with this, let me know if you need any help.

New reply to an old topic, but this is the only thread I can find on it…

Thanks for the code, @sc1982 - I am relatively new to OpenHAB, and this was certainly a good start. I have an Interlogix NX-8V2 system, communicating with my OpenHAB install via NX-587E (the command set is the same as the NX-8E). I have it reading the text strings back from the alarm system, and I can tell they contain the same codes as your code sample indicates. My problem comes in analyzing the text string. You did not define the NX8E_Panel_buffer item, so I’m assuming it’s a String type. However, when I try to call the “contains” method of the object, I get the error “The name ‘contains’ cannot be resolved to an item or type”.

I feel like I’m close to getting this working, but I just can’t get past this wall, and I can’t find a good source of documentation that references this.

Any pointers in the right direction would be greatly appreciated.


For anyone still interested I developed the binding which is now part of openhab.
It is called [caddx].

See also

Yes. Thanks, @jossuar.