Interlogix Ultrasync

/v_CN_0.108-m/lang_engeu.js

currently on Hass.io

Any way I can help with testing?

I assume we only have to copy the folder ultrasync from your github?

@stefdewilde:
No the best thing you can do at this time would be to gain access to your Pi and type the following:

# pull latest version from github, this way i can provide updates as we
# test (if required) and you can pull the latest all the time:
pip3 install git+https://github.com/caronc/ultrasync.git

Only then will you get access to the ultrasync command.

@panos2310: Interesting v_CN_0.108-m eh? This is all new to me as I’m learning as i go; I thought all of the UltraSync Hub’s were also nicknamed Zerowire (which was where i assumed the ZW came from on my system). Not sure what CN stands for and the versioning is so much different. Hopefully the all of the web interface isn’t too different. At the very least, it would be great if you could install the ultrasync standalone tool (lots of docs now in this thread on how to do it and set up a config file). I’d encourage you to send me your --dump-data results as well via email if you could. At the very least, if you can just log into your system (via it’s webpage) and view the HTML source (as you already did to provide me the version); just copy/paste that entire page into a attachment you can email me (or paste it straight into the email itself). I’ll just need something to work with so i can see how the versions/systems vary. HOPEFULLY :crossed_fingers: the systems are close enough that things won’t require much (if any at all) effort to get you set up.

Can’t seem to install anything through pip with the HomeAssistant OS.

This is my source:

<head>
	<meta charset="ISO-8859-1">
	<title>NX-595E :: Secure Network</title>
	<meta name="viewport" content="initial-scale=1.0, width=device-width, maximum-scale = 1.0, minimum-scale = 1.0" />
	<link href="/v_CN_0.108-j/m.css" rel="stylesheet">
	<script src="/v_CN_0.108-j/master.js" charset="utf-8"></script>
	<script src="/v_CN_0.108-j/status.js" charset="utf-8"></script>
  	<script src="/v_CN_0.108-j/engeu.js" charset="utf-8"></script> 

This is how my login look likes:

@stefdewilde: Your website looks very, very similar to mine with a few different options (I don’t have Email Reporting options, etc). I don’t think that matters though. Try doing this inside of your HA OS first and see if it works:

sudo apt update
sudo apt install python3-pip
# Then try installing ultrasync
sudo pip3 install git+https://github.com/caronc/ultrasync.git

# You should be able to call `ultrasync` now:
ultrasync -h

Hi Chris,

I’ve been working on getting the NX595E integrated into HA. I’ve found a number of other projects that I have modified/updated to work with my NX595E. I’ve looked at your code and our interfaces are very similar but our hardware (NX595E) are quite different. Would be nice if we could work together to get the Ultrasync Hub and NX595E working in one integration.

I’m no developer but have some basic scripting knowledge. More then happy to share my code to anyone that would like to help.

I had started another topic already

Yeah sorry, it seems this thread bounces back and forth between 595 and your hardware quite a bit Chris. I can confirm my setup is identical (in view source) as what @stefdewilde posted above. Unfortunately Im not clever enough to write the code, but will happily test anything you or Divyesh comes up with.

@dd77: Thanks for reaching out! I’d gladly work with you to make a single integration for sure. :+1: :slightly_smiling_face: Are the interfaces really that different? I can see by the screenshot above, the NX-595E login looks very similar to the UltraSync. I pictured the development team just doing a copy/paste behind the scenes. I mean they even went as far as to re-use the version information in the .css, and .js references; here is what it looks like for me:

I imagine under the hood it would work based on Areas and Zone banks. Zones (Sensors) were the hardest for me to grasp as they were parsed the strangest (like 16 banks, and the first 2 bytes of all 16 matched up with each sensor. Once I grasped that, it was easier to reverse engineer the rest of the code.

Does the NX-595E behave much differently? I would love to see the HTML files; i imagine they must be similar; no?

@bojo: No problem! We’ll get this straightened out; i’d love to be able to make both systems work under this integration if it’s at all possible for sure. I won’t leave you stranded. I just need time since I am operating blindly with the other model; but it seems as though @dd77 arrived like a knight in shining armor!

Ive sent you an email with the page source. I can confirm that --debug-dump does not work due to similar traceback errors mentioned before.

It looks like the interface are very similar.

Ill send you my files for the Comnav NX595E version, there is also a Interlogix NX595E version available with slightly different code to mine.

It seems that the various integrations are the same hardware/firmware with different brand names.

These alarm systems where sold from GE I thing in the beginning and it seems that they have been sold from one company to another during the course of years and changed names only.

The interface is the same as it seems. The options that are available differ on the kind of account that you log in with. If you log in as an installer you get more options.
Also, if you log in as an installer you can choose what settings the users can/see change. It also depends if you put the alarm in program mode (you get more options).

I would be happy with the ability to get notified with an armed/disarmed status, as I want to set other devices accordingly.

The ability to arm/disarm at a specific time of day is available already in the alarm system, but it is not considered a safe practice.

I use the App for my smartphone Interlogix Ultrasync. So the systems are the same.

Using sudo and install just doesn’t work on an raspberry pi using home assistant os :wink:

Edit time:

I made a docker version of Home Assistant and added ultrasync! It shows up in my integrations. Sadly, can’t add my data. I get an unexpected error

2020-11-06 07:09:52 ERROR (MainThread) [homeassistant.components.ultrasync.config_flow] Unexpected exception
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/components/ultrasync/config_flow.py", line 68, in async_step_user
await self.hass.async_add_executor_job(
File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/src/homeassistant/homeassistant/components/ultrasync/config_flow.py", line 38, in validate_input
if not usync.login():
File "/usr/local/lib/python3.8/site-packages/ultrasync/main.py", line 143, in login
if not self._areas(response=response) or not self._zones():
File "/usr/local/lib/python3.8/site-packages/ultrasync/main.py", line 418, in _areas
sequence = json.loads(match.group('sequence'))
File "/usr/local/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/lib/python3.8/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

This is what the debug dump gives me

/usr/src/homeassistant # ultrasync --config=/root/stef/config.conf --debug-dump
2020-11-06 07:12:13,918 - ERROR - Failed to query http://192.168.0.247/login.cgi
2020-11-06 07:12:13,918 - ERROR - Failed to authenticate to 192.168.0.247

Just wanted to thank all those that emailed me and the few that private messaged me here! It’s amazing all the help you’re all offering! I will hopefully have more time to look at this tonight and/or this weekend. One major difference between our two panels is the zones.htm file.

UltraSync zones.html

Here is what mine looks like (and this is what my tool currently parses):

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>UltraSync :: Secure Network</title>
  <meta name="viewport" content="initial-scale=1.0, width=device-width, maximum-scale = 1.0, minimum-scale = 1.0" />
  <script src="/v_ZW_03.02-C/eng_us.js" charset="utf-8"></script>
   <link href="/v_ZW_03.02-C/m.css" rel="stylesheet">
  <script src="/v_ZW_03.02-C/master.js" charset="utf-8"></script>
  <script src="/v_ZW_03.02-C/status.js" charset="utf-8"></script>
 
</head>
<body onload = "afterLoad();">
  <script>
  var zoneDisplay = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

  var zoneNames = ["Sensor%20No1","Sensor%20No2","Sensor%20No3","Sensor%20No4","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21","%21"];
  var zoneSequence = [108,0,2,77,12,100,0,12,0,14,175,91,0,0,0,0,26,0];
  var zoneStatus = ["000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","040200000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","000000000000000000000000","E0F2FFFFFFFFFFFFFFFFFFFF"];
  var ismaster = 1;
  var isinstaller = 0;
  
  function getSession(){return "158BE52A55BFF0A0";}
...

Comnav zones.htm

Here is what the ones who are getting the JSON error:

<!doctype html>
<html>
<head>
  <meta charset="ISO-8859-1">
  <title>ComNav :: Secure Network</title>
  <meta name="viewport" content="initial-scale=1.0, width=device-width, maximum-scale = 1.0, minimum-scale = 1.0" />
  <link href="/v_CN_0.106-j/m.css" rel="stylesheet">
  <script src="/v_CN_0.106-j/master.js" charset="utf-8"></script>
  <script src="/v_CN_0.106-j/status.js" charset="utf-8"></script>
</head>
<body onload = "afterLoad();">
  <script>
  var zoneDisplay = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  var zoneStates = new Array("Not Ready", "Tamper", "Trouble","Bypass","Inhibited","Alarm","Low Battery","Supervision Fault"
    ,"","","","","","");

  var zoneNames = new Array("","","","","","","","","","","","","","","","");
  var zoneSequence = new Array(27,0,0,0,239,182,0,0,0,0,129,0,0,0);
  var zoneStatus = new Array(new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0),new Array(0,0));

  function getSession(){return "87FCE66F5B718C96";}
...

For the non-developers, I’m just letting you know the problem we will have to solve (and no doubt it will happen) is how to figure out the connection between the 2 very differently presented variables (for the same hardware). Specifically have a look at the zoneSequence and zoneStatus variables (see how they differ above). I’m pretty sure the zoneSequence is apples to apples to the other (just presented slightly differently). The zoneStatus is a different ball game though.

I think under the hood, I can use the /v_CN_xx.xx-y/ as a switch. Depending if it’s a CN or a ZW I’ll have to parse these 2 variables differently.

There are other minor differences too which shouldn’t have a negative outcome to our goals such as:

  • the encoding… utf-8 vs iso-8859-1
    • This is worth keeping in the back of our head as Python v3 (what HA uses) is all utf-8. So any special characters that exist in Area/Sensor assignments could cause a crash later on. First round of fixing this I’m going to ignore this, but to keep in the back of our mind to support all character sets.
  • the NX-595 doesn’t tell you on the first page if you’re the installer and or a master account.
    • At this time, this info is nice to have but not useful for our purposes

seq.json

Some more details I’d like to have from you all If one of you guys could also log into your NX-595 and use your browsers Network Console (this is part of Chrome/Firefox’s developer tools) and have a look for a file that repetitively gets updated and requested called seq.json. I would love for someone to email me or private message me a copy of this too. This file plays an important roll in getting status updates.

status.json

If a sensor get’s tripped in your house, this will be reflected in the seq.json file. But a request to status.json is then made to get more details on the change that took place when this happens. So to get a copy of this file, you’ll just need to wave your hands in-front of a sensor; or open your front door or something. I’d really appreciate if someone can provide me a copy of there NX595 hub version of it.

Hi Chris. I have a ComNav branded system and am sending you the files mentioned via email today. The only point worth noting here I think is rather than a seq.json file, I appear to have a seq.xml file instead.

If you require further details just let me know. Thanks!

Hey Adam,

I have the Networx NX 595E. I assume that both are the same with only a different brand name. I also don’t have the seq.json. I already send all my files to Chris.

Chris will do his magic tricks :wink:

Hi all!

So this has turned out to be quite a massive change! :astonished:… I won’t lie; I spent more then 5 hrs today on it (I didn’t realize the time going by); I’m not done, but 3,300 lines of code later, i created my first Pull Request for it that should be testable by anyone feeling brave!

If you followed my instructions above, you’ll just want to uninstall your current copy of ultrasync and manually install the one from this branch instead:

# make sure it's not already installed (so you don't have any conflicts)
pip uninstall ultrasync

# Then install the branch version:
pip install git+https://github.com/caronc/ultrasync.git@comnav-compatibility

All of the commands are the same. Now please go easy on me: I don’t anticipate this is going to work the first time in Home Assistant.. But it should work… or at least allow us to troubleshoot it and work out the final details from the command line:

# dump system details from your alarm panel:
ultrasync -c /path/to/config.conf --details

# Also set up a watch if you want (i really don't think this will work for long):
ultrasync -c /path/to/config.conf --watch

# This might even work this time:
ultrasync -c /path/to/config.conf --debug-dump

Again, i want to re-iterate, this was a really big change… Not only was the zones.htm different between our alarm panels, but as you all observed and told me, it operates on XML files (not JSON). So i had to write a lot of additional XML parsing for seq.xml, status.xml, etc. The banks are parsed way differently too which made even more work… :sweat:

Anyway… Since i don’t have the alarm panel; i need all of your help here to report back here (or in the Pull Request I made) what happens :slight_smile:.

I also want to thank everyone again who emailed me and or private messaged me some of their status files. :+1: I was able to create some unit tests too with this code as a result. :tada:

Finally, I’d love if someone could click on the Zones link after signing into their Hub’s webpage (must be via ComNav) and trip a sensor or two… That will cause your device to send you a zstate.xml file (I’m guessing, because my panel sends me a zstate.json file). I’d like to have this file; i believe it should provide me the only missing puzzle piece i need (no promises) to complete this task (and add more testing).

I look forward to hearing back from any of you and hearing about any update success and failures!

Hi Chris,

Looks like lots of progress! Thanks again for putting in all that time. Here is an update for you.

~$ /home/bryan/.local/bin/ultrasync -c ultrasync/config.conf --watch
2020-11-08 08:07:59 [001] MasterBed Motion        : Ready
2020-11-08 08:07:59 [001] Living Room Motion      : Ready
2020-11-08 08:07:59 [001] Kitchen/DiningMotion    : Ready
2020-11-08 08:07:59 [001] Theater Motion          : Ready
2020-11-08 08:07:59 [001] Hallway Motion          : Ready
2020-11-08 08:07:59 [001] Activity Room Motion    : Ready
2020-11-08 08:07:59 [001] Workshop Window Vib     : Ready
2020-11-08 08:07:59 [001] Front Door              : Ready
2020-11-08 08:07:59 [001] Garage Door             : Ready
2020-11-08 08:07:59 [001] Workshop Door           : Ready
2020-11-08 08:07:59 [001] Garage Window Vib       : Ready
2020-11-08 08:07:59 [001] siren tamper            : Ready
2020-11-08 08:07:59 [001] Alfresco Door           : Ready
2020-11-08 08:07:59 [001] Theater Door            : Ready
2020-11-08 08:07:59 [001] Guest Bedroom           : Ready
2020-11-08 08:07:59 [001] Kids Room 1             : Ready
2020-11-08 08:07:59 [001] Laundry Door            : Ready
2020-11-08 08:07:59 [181] Home                    : Not Ready
---
Traceback (most recent call last):
  File "/home/bryan/.local/bin/ultrasync", line 8, in <module>
    sys.exit(main())
  File "/usr/lib/python3/dist-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3/dist-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3/dist-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/home/bryan/.local/lib/python3.8/site-packages/ultrasync/cli.py", line 190, in main
    results = usync.details()
  File "/home/bryan/.local/lib/python3.8/site-packages/ultrasync/main.py", line 451, in details
    if not self.update():
  File "/home/bryan/.local/lib/python3.8/site-packages/ultrasync/main.py", line 436, in update
    if not self._sequence():
  File "/home/bryan/.local/lib/python3.8/site-packages/ultrasync/main.py", line 1305, in _sequence
    return getattr(self, '_{}_sequence'.format(self.vendor))()
  File "/home/bryan/.local/lib/python3.8/site-packages/ultrasync/main.py", line 1409, in _comnav_sequence
    response = self.__get('/user/seq.xml', rtype=HubResponseType.XML)
  File "/home/bryan/.local/lib/python3.8/site-packages/ultrasync/main.py", line 1540, in __get
    response = ET.fromstring(
AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'

/home/bryan/.local/bin/ultrasync -c ultrasync/config.conf --details
{
  "areas": [
    {
      "bank": 0,
      "bank_state": [
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0
      ],
      "name": "Home",
      "priority": 5,
      "sequence": 181,
      "states": {
        "armed": false,
        "chime": false,
        "exit1": false,
        "exit2": false,
        "partial": false
      },
      "status": "Not Ready"
    }
  ],
  "date": "2020-11-08 08:07:49",
  "user": {
    "is_installer": null,
    "is_master": null
  },
  "zones": [
    {
      "bank": 0,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "MasterBed Motion",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 1,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Living Room Motion",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 2,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Kitchen/DiningMotion",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 3,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Theater Motion",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 4,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Hallway Motion",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 5,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Activity Room Motion",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 7,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Workshop Window Vib",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 8,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Front Door",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 9,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Garage Door",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 10,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Workshop Door",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 11,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Garage Window Vib",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 15,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "siren tamper",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 16,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Alfresco Door",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 17,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Theater Door",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 18,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Guest Bedroom",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 19,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Kids Room 1",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 20,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "Laundry Door",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    }
  ]
}

/home/bryan/.local/bin/ultrasync -c ultrasync/config.conf --debug-dump
2020-11-08 08:08:10,810 - ERROR - Failed to query http://192.168.1.145/user/rooms.htm
2020-11-08 08:08:11,042 - ERROR - Failed to query http://192.168.1.145/v_CN_0.108-m/zwave.js

And the response from 3 different sensors trips. Sensor A, Sensor B and then Sensor A again.

<response>
  <zstate>0</zstate>
  <zseq>188</zseq>
  <zdat>0,0,0,0,0,0,0,0,0</zdat>
</response>

<response>
  <zstate>0</zstate>
  <zseq>193</zseq>
  <zdat>4,0,0,0,0,0,0,0,0</zdat>
</response>

<response>
  <zstate>0</zstate>
  <zseq>196</zseq>
  <zdat>0,0,0,0,0,0,0,0,0</zdat>
</response>

Thanks Chris for all the hard work. My NX doesnt display any zone names due to the older firmware.
Here is the output of the two commands

ultrasync.conf --details

{
  "areas": [
    {
      "bank": 0,
      "bank_state": [
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0
      ],
      "name": "Area 1",
      "priority": 5,
      "sequence": 185,
      "states": {
        "armed": false,
        "chime": false,
        "exit1": false,
        "exit2": false,
        "partial": false
      },
      "status": "Not Ready"
    }
  ],
  "date": "2020-11-08 13:39:11",
  "user": {
    "is_installer": null,
    "is_master": null
  },
  "zones": []
}

ultrasync.conf --watch

Also noticed that the Area 1 status is displaying the incorrect status. “Not Ready” it should be “No System Faults” or “Ready”

020-11-08 13:39:51 [185] Area 1                  : Not Ready
---
Traceback (most recent call last):
  File "/home/divyesh/.local/bin/ultrasync", line 8, in <module>
    sys.exit(main())
  File "/usr/lib/python3/dist-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3/dist-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3/dist-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/divyesh/.local/lib/python3.8/site-packages/ultrasync/cli.py", line 190, in main
    results = usync.details()
  File "/home/divyesh/.local/lib/python3.8/site-packages/ultrasync/main.py", line 451, in details
    if not self.update():
  File "/home/divyesh/.local/lib/python3.8/site-packages/ultrasync/main.py", line 436, in update
    if not self._sequence():
  File "/home/divyesh/.local/lib/python3.8/site-packages/ultrasync/main.py", line 1305, in _sequence
    return getattr(self, '_{}_sequence'.format(self.vendor))()
  File "/home/divyesh/.local/lib/python3.8/site-packages/ultrasync/main.py", line 1409, in _comnav_sequence
    response = self.__get('/user/seq.xml', rtype=HubResponseType.XML)
  File "/home/divyesh/.local/lib/python3.8/site-packages/ultrasync/main.py", line 1540, in __get
    response = ET.fromstring(
AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'
<response>
  <zstate>0</zstate>
  <zseq>17</zseq>
  <zdat>2,0</zdat>
</response>
<response>
  <zstate>10</zstate>
  <zseq>1</zseq>
  <zdat>0,0</zdat>
</response>

Hey Chris,

Contents of zstate.xml below for you as requested. Great work so far. Thanks!

<response>
<zstate>0</zstate>
<zseq>81</zseq>
<zdat>0,0,0,0,0,0,0,0,0</zdat>
</response>

With the new update I can do the following:

I can add the alarm as an integration to my HA test server. It reads the status of the area (ready, not ready). If I activate my alarm through my phone/browser it works.

Using the services that are provided doesn’t work. I assume those aren’t updated yet with the new version?

/config # ultrasync -c /config/config.conf --details
{
  "areas": [
    {
      "bank": 0,
      "bank_state": [
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0
      ],
      "name": "Woning",
      "priority": 5,
      "sequence": 199,
      "states": {
        "armed": false,
        "chime": false,
        "exit1": false,
        "exit2": false,
        "partial": false
      },
      "status": "Not Ready"
    }
  ],
  "date": "2020-11-08 02:54:53",
  "user": {
    "is_installer": null,
    "is_master": null
  },
  "zones": [
    {
      "bank": 0,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "sabotage sirene",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 1,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "det nachthall",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 3,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "det wasplaats",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 4,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "det inkom",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 5,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "det living",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 6,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "det garage",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    },
    {
      "bank": 7,
      "bank_state": "00000000000000",
      "can_bypass": null,
      "name": "brand",
      "priority": 5,
      "sequence": 1,
      "status": "Ready"
    }
  ]
}
/config # ultrasync -c /config/config.conf --debug-dump
2020-11-08 02:56:19,950 - ERROR - Failed to query http://192.168.0.247/v_CN_0.108-j/zwave.js
/config # ultrasync -c /config/config.conf --watch
2020-11-08 02:57:12 [001] sabotage sirene         : Ready
2020-11-08 02:57:12 [001] det nachthall           : Ready
2020-11-08 02:57:12 [001] det wasplaats           : Ready
2020-11-08 02:57:12 [001] det inkom               : Ready
2020-11-08 02:57:12 [001] det living              : Ready
2020-11-08 02:57:12 [001] det garage              : Ready
2020-11-08 02:57:12 [001] brand                   : Ready
2020-11-08 02:57:12 [199] Woning                  : Not Ready
---

Thanks for all of your time and effort Chris!