maximvelichko / pyvera

A python library to control devices via the Vera hub
GNU General Public License v2.0
26 stars 30 forks source link

comm_failure method incorrectly returns True when CommFailure variable not present in Vera response #145

Closed tgrusendorf closed 3 years ago

tgrusendorf commented 3 years ago

Problem: For devices which have never had a communication failure, the VeraDevice comm_failure method incorrectly returns True when the device is communicating. This is due to the 'CommFailure' variable not being present in the device info returned by Vera.

It appears that my Vera Edge does not include the CommFailure variable in the device info that it returns until there has been a communication failure. At this point, the CommFailure variable starts appearing in responses, with a value of '1'. After communication returns to normal, it continues to include the CommFailure variable in reponses, with a value of '0'.

If the response does not include the CommFailure variable, the comm_failure method incorrectly returns True since the variable is not equal to '1':

    @property
    def comm_failure(self) -> bool:
        """Return the Communication Failure Flag."""
        return cast(str, self.get_strict_value("commFailure")) != "0"

I tried modifying the method to check for the existence of the value first, it it performs as expected:

    @property
    def comm_failure(self) -> bool:
        """Return the Communication Failure Flag."""
        flag = self.get_strict_value("commFailure")
        if flag is not None:
            return cast(str, flag) != "0"
        else:
            return False

Further detail: Vera Edge controller firmware version: 1.7.5185 (7.31) Device under test: Leviton DZ15S

Example response from a device which has not experienced a communication failure:

            "states": [
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "Capabilities",
                    "value": "211,156,1,4,16,1,L,R,B,RS,|32,37,39,43,44,89,90,94,112,114,115,122,133,134,",
                    "id": 0
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PollSettings",
                    "value": "0",
                    "id": 1
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "ManufacturerInfo",
                    "value": "29,13313,1",
                    "id": 2
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "VersionInfo",
                    "value": "3,4,33,1,20",
                    "id": 3
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "VariablesSet",
                    "value": "7-Locator LED Status (0=LED or 254=Status Mode or 255=Locator Mode),1d,",
                    "pnp": "*1.7.5185*",
                    "id": 4
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "Configured",
                    "value": "1",
                    "id": 5
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "NodeInfo",
                    "value": "20,25,27,2b,2c,59,5a,5e,70,72,73,7a,85,86,",
                    "id": 6
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PlusInfo",
                    "value": "1,5,0,7,0,7,0",
                    "id": 7
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "FirmwareInfo",
                    "value": "29,257,23255",
                    "id": 8
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "AgiInfo",
                    "value": "X",
                    "id": 9
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "ConfiguredAssoc",
                    "value": "",
                    "id": 10
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "VariablesGet",
                    "value": "7,255,",
                    "id": 11
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "ConfiguredVariable",
                    "value": "7-Locator LED Status (0=LED or 254=Status Mode or 255=Locator Mode),1d,",
                    "id": 12
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "ModeSetting",
                    "value": "1:;2:;3:;4:",
                    "id": 13
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "LastUpdate",
                    "value": "1610911045",
                    "id": 14
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "FirstConfigured",
                    "value": "1610911045",
                    "id": 15
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "Neighbors",
                    "value": "",
                    "id": 16
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastReset",
                    "value": "1610911044",
                    "id": 17
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "AssociationNum",
                    "value": "1",
                    "id": 18
                },
                {
                    "service": "urn:upnp-org:serviceId:SwitchPower1",
                    "variable": "Status",
                    "id": 19,
                    "value": "0"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PollOk",
                    "id": 20,
                    "value": "53"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "PollRatings",
                    "id": 21,
                    "value": "4.90"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveNetwork1",
                    "variable": "LastPollSuccess",
                    "id": 22,
                    "value": "1611982800"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveNetwork1",
                    "variable": "ConsecutivePollFails",
                    "id": 23,
                    "value": "0"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastRouteUpdate",
                    "value": "1610911105",
                    "id": 24
                },
                {
                    "service": "urn:upnp-org:serviceId:SwitchPower1",
                    "variable": "Target",
                    "id": 25,
                    "value": "0"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "sl_Hail",
                    "id": 26,
                    "value": "1"
                },
                {
                    "id": 167,
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastNnu",
                    "value": "1611910800,8"
                },
                {
                    "id": 169,
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastArr",
                    "value": "1611910800,8"
                },
                {
                    "id": 85,
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PollNoReply",
                    "value": "1"
                }
            ],

Example response from a device which has previously experienced a communication failure and has returned to normal:

            "states": [
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "Capabilities",
                    "value": "211,156,1,4,16,1,L,R,B,RS,|32,37,39,43,44,89,90,94,112,114,115,122,133,134,",
                    "id": 0
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PollSettings",
                    "value": "0",
                    "id": 1
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "ManufacturerInfo",
                    "value": "29,13313,1",
                    "id": 2
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "VersionInfo",
                    "value": "3,4,33,1,20",
                    "id": 3
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "VariablesSet",
                    "value": "7-Locator LED Status (0=LED or 254=Status Mode or 255=Locator Mode),1d,",
                    "pnp": "*1.7.5185*",
                    "id": 4
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "Configured",
                    "value": "1",
                    "id": 5
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "NodeInfo",
                    "value": "20,25,27,2b,2c,59,5a,5e,70,72,73,7a,85,86,",
                    "id": 6
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PlusInfo",
                    "value": "1,5,0,7,0,7,0",
                    "id": 7
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "FirmwareInfo",
                    "value": "29,257,23255",
                    "id": 8
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "AgiInfo",
                    "value": "X",
                    "id": 9
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "ConfiguredAssoc",
                    "value": "",
                    "id": 10
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "VariablesGet",
                    "value": "7,255,",
                    "id": 11
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "ConfiguredVariable",
                    "value": "7-Locator LED Status (0=LED or 254=Status Mode or 255=Locator Mode),1d,",
                    "id": 12
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "ModeSetting",
                    "value": "1:;2:;3:;4:",
                    "id": 13
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "LastUpdate",
                    "value": "1610911208",
                    "id": 14
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "FirstConfigured",
                    "value": "1610911208",
                    "id": 15
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "Neighbors",
                    "value": "",
                    "id": 16
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastReset",
                    "value": "1610911206",
                    "id": 17
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "AssociationNum",
                    "value": "1",
                    "id": 18
                },
                {
                    "service": "urn:upnp-org:serviceId:SwitchPower1",
                    "variable": "Status",
                    "id": 19,
                    "value": "0"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "PollOk",
                    "id": 20,
                    "value": "25"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "PollRatings",
                    "value": "5.00",
                    "id": 21
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveNetwork1",
                    "variable": "LastPollSuccess",
                    "id": 22,
                    "value": "1611349099"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:ZWaveNetwork1",
                    "variable": "ConsecutivePollFails",
                    "value": "0",
                    "id": 23
                },
                {
                    "service": "urn:upnp-org:serviceId:SwitchPower1",
                    "variable": "Target",
                    "id": 24,
                    "value": "0"
                },
                {
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "sl_Hail",
                    "id": 25,
                    "value": "1"
                },
                {
                    "id": 131,
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastNnu",
                    "value": "1611910800,8"
                },
                {
                    "id": 133,
                    "service": "urn:micasaverde-com:serviceId:ZWaveDevice1",
                    "variable": "LastArr",
                    "value": "1611910800,8"
                },
                {
                    "id": 256,
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "CommFailure",
                    "value": "0"
                },
                {
                    "id": 1,
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "CommFailureTime",
                    "value": "0"
                },
                {
                    "id": 36,
                    "service": "urn:micasaverde-com:serviceId:HaDevice1",
                    "variable": "CommFailureAlarm",
                    "value": "1611349097,0"
                }
            ],
pavoni commented 3 years ago

Thanks for the detailed report and detective work.

You almost wrote the PR anyway!

If you can test that would be great - although the code should be pretty safe.

https://github.com/pavoni/pyvera/pull/146

pavoni commented 3 years ago

BTW ``` is your friend for formatting - I changed the first code block for you as an example.

tgrusendorf commented 3 years ago

Thanks! Tested, comment added describing the 3 test cases, and approved.

Being a hobbyist I only have passing familiarity with the PR process. I tested by pasting the modified code into my local copy of the library. Is there an easy way for me to load the library with the proposed PR on my machine for testing?

pavoni commented 3 years ago

I've released it now - so just bump your version if that's easy.

How to install a PR version of a library depends a lot on what's you're running - and how it's installed.