pyHik icon indicating copy to clipboard operation
pyHik copied to clipboard

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

Open pete-leese opened this issue 2 years ago • 20 comments

Hi,

I am a Home Assistant user, and recently installed a DYN 7608NXI HikVision NVR, however the following error appears during the integration starting, I believe that this maybe an issue with this wrapper.


Traceback (most recent call last):
  File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.9/threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.9/site-packages/pyhik/hikvision.py", line 534, in alert_stream
    self.process_stream(tree)
  File "/usr/local/lib/python3.9/site-packages/pyhik/hikvision.py", line 615, in process_stream
    state = self.fetch_attributes(etype, echid)
  File "/usr/local/lib/python3.9/site-packages/pyhik/hikvision.py", line 663, in fetch_attributes
    if sensor[1] == int(channel):
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

pete-leese avatar Jan 17 '22 22:01 pete-leese

Also only a few sensors are imported, I guess it is breaking part way through the initial bootstrap. Currently integration is not functional for my NVR

pete-leese avatar Jan 21 '22 19:01 pete-leese

Can you try to monitor the alertStream endpoint manually and post the output after you've let it run for ~5min, hopefully with a camera trigger captured?

This will let you monitor the alertStream, I'd expect the first one to work, but please try both and let me know what the outputs are.

curl --digest -N http://YOUR_CAM_IP/Event/notification/alertStream
or
curl --digest -N http://YOUR_CAM_IP/ISAPI/Event/notification/alertStream

mezz64 avatar Jan 24 '22 16:01 mezz64

I assume you mean the IP address of the NVR as each camera is on POE address from the NVR.

when I curl Access "curl --digest -N http://YOUR_CAM_IP/ISAPI/Event/notification/alertStream" I get the following error:

Error: 401 -- Unauthorized

pete-leese avatar Jan 24 '22 17:01 pete-leese

Yes, NVR IP. Are you using digest or basic authentication? You can drop the --digest if you are using basic.

mezz64 avatar Jan 24 '22 18:01 mezz64

I think both are selected. How do I pass credentials in to authenticate with api?

pete-leese avatar Jan 24 '22 20:01 pete-leese

It should ask, but if it isn't you can use the -u flag to include a username, and curl will prompt for a password:

curl -u username --digest -N http://YOUR_NVR_IP/ISAPI/Event/notification/alertStream

mezz64 avatar Jan 24 '22 20:01 mezz64

Just getting a lot of these:

<EventNotificationAlert version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema"> <ipAddress>192.168.xx.xx</ipAddress> <portNo>80</portNo> <protocolType>HTTP</protocolType> <macAddress>ac:b9:2f:07:f8:85</macAddress> <dynChannelID/> <channelID/> <dateTime>2022-01-25T12:07:27+00:00</dateTime> <activePostCount>0</activePostCount> <eventType>videoloss</eventType> <eventState>inactive</eventState> <eventDescription>videoloss alarm</eventDescription> <channelName/> </EventNotificationAlert> --boundary Content-Type: application/xml; charset="UTF-8" Content-Length: 493

pete-leese avatar Jan 25 '22 13:01 pete-leese

That's expected as the videoloss event is used as a keep-alive in the stream. If you have a trigger type setup to notify the surveillance center it should show up in that stream when triggered.

Since your error occurs during setup, let's start by posting what you get as soon as you connect and then a snippet during a trigger. It looks like your NVR may not by posting the camera channel in the same format, but I need to see what an actual trigger looks like to determine that.

mezz64 avatar Jan 25 '22 18:01 mezz64

Gotcha, makes perfect sense.

Here is a trigger event:

<EventNotificationAlert version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
<ipAddress>192.168.xx.xx</ipAddress>
<portNo>80</portNo>
<protocolType>HTTP</protocolType>
<macAddress>ac:b9:2f:07:f8:85</macAddress>
<dynChannelID>2</dynChannelID>
<channelID>2</channelID>
<dateTime>2022-01-26T09:36:58+00:00</dateTime>
<activePostCount>1</activePostCount>
<eventType>VMD</eventType>
<eventState>active</eventState>
<eventDescription>Motion alarm</eventDescription>
<channelName>Side</channelName>
<detectionPictureTransType>url</detectionPictureTransType>
<detectionPicturesNumber>1</detectionPicturesNumber>
<bkgUrl>http://192.168.xx.xx:80/picture/Streaming/tracks/203/?name=ch00002_00010000023000776243200233348&amp;size=233348</bkgUrl>
<URLCertificationType>digest</URLCertificationType>
<targetType>human</targetType>
</EventNotificationAlert>
--boundary
Content-Type: application/xml; charset="UTF-8"
Content-Length: 493

pete-leese avatar Jan 26 '22 09:01 pete-leese

Here's another:


<EventNotificationAlert version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
<ipAddress>192.168.xx.xx</ipAddress>
<portNo>80</portNo>
<protocolType>HTTP</protocolType>
<macAddress>ac:b9:2f:07:f8:85</macAddress>
<dynChannelID>1</dynChannelID>
<channelID>1</channelID>
<dateTime>2022-01-26T10:13:42+00:00</dateTime>
<activePostCount>1</activePostCount>
<eventType>linedetection</eventType>
<eventState>active</eventState>
<eventDescription>linedetection alarm</eventDescription>
<channelName>Front</channelName>
<DetectionRegionList>
<DetectionRegionEntry>
<regionID>0</regionID>
<RegionCoordinatesList>
</RegionCoordinatesList>
<detectionTarget>human</detectionTarget>
<TargetRect>
<X>0.273958</X>
<Y>0.362132</Y>
<width>0.070833</width>
<height>0.237132</height>
</TargetRect>
</DetectionRegionEntry>
</DetectionRegionList>
<detectionPictureTransType>url</detectionPictureTransType>
<detectionPicturesNumber>1</detectionPicturesNumber>
<bkgUrl>http://192.168.xx.xx:80/picture/Streaming/tracks/103/?name=ch00001_00010000476025141708800081676&amp;size=81676</bkgUrl>
<URLCertificationType>digest</URLCertificationType>
</EventNotificationAlert>
--boundary
Content-Type: application/xml; charset="UTF-8"
Content-Length: 493

pete-leese avatar Jan 26 '22 10:01 pete-leese

Does this give you the information you need to resolve?

pete-leese avatar Feb 01 '22 16:02 pete-leese

Almost, can you define debug logging in HASS for the hikvision parts (example below) and post a full log from startup?

logs:
   pyhik.hikvision: debug
   homeassistant.components.binary_sensor.hikvision: debug

mezz64 avatar Feb 01 '22 17:02 mezz64

Apologies for the delay.

https://pastebin.com/bnQnJqCp

pete-leese avatar Feb 23 '22 09:02 pete-leese

Is that all the debug you need now or do you need anything further to get a fix released ?

pete-leese avatar Feb 25 '22 14:02 pete-leese

Has this been fixed yet @mezz64 ? Cheers

pete-leese avatar Mar 19 '22 09:03 pete-leese

I've not had the free time as of late to implement a fix. I'll see what I can do this coming week to get it taken care of

mezz64 avatar Mar 19 '22 11:03 mezz64

Hi, same NVR and same issue. The binary sensors are created for individual channels but they stay off.

image

Since the pastebin is not available anymore, here's my debug log:

2022-06-02 15:19:02 DEBUG (Thread-3) [pyhik.hikvision] Stream Thread Started: NVR, 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx
2022-06-02 15:19:02 DEBUG (Thread-3) [pyhik.hikvision] NVR Connection Successful.
2022-06-02 15:19:20 DEBUG (Thread-3) [pyhik.hikvision] Device alerts namespace: http://www.isapi.org/ver20/XMLSchema
2022-06-02 15:19:20 ERROR (Thread-3) [root] Uncaught thread exception
Traceback (most recent call last):
File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner
self.run()
File "/usr/local/lib/python3.9/threading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python3.9/site-packages/pyhik/hikvision.py", line 534, in alert_stream
self.process_stream(tree)
File "/usr/local/lib/python3.9/site-packages/pyhik/hikvision.py", line 615, in process_stream
state = self.fetch_attributes(etype, echid)
File "/usr/local/lib/python3.9/site-packages/pyhik/hikvision.py", line 663, in fetch_attributes
if sensor[1] == int(channel):
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
2022-06-02 15:24:20 DEBUG (Thread-14) [pyhik.hikvision] NVR Watchdog expired. Resetting connection.

Mincka avatar Jun 02 '22 13:06 Mincka

I have another startup log with more information:

2022-06-02 16:21:50 DEBUG (SyncWorker_3) [pyhik.hikvision] pyHik 0.3.0 initializing new hikvision device at: http://10.0.0.71
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Device info namespace: http://www.isapi.org/ver20/XMLSchema
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Device triggers namespace: http://www.isapi.org/ver20/XMLSchema
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Processed 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx as NVR Device.
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Found events: {'tamperdetection': [1, 2], 'videoloss': [1, 2], 'fielddetection': [1, 2], 'scenechangedetection': [1, 2], 'diskfull': [0]}
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Initialized Dictionary: {'Tamper Detection': [[False, 1, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283316)], [False, 2, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283334)]], 'Video Loss': [[False, 1, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283339)], [False, 2, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283342)]], 'Field Detection': [[False, 1, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283346)], [False, 2, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283348)]], 'Scene Change Detection': [[False, 1, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283352)], [False, 2, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283355)]], 'Disk Full': [[False, 0, 0, datetime.datetime(2022, 6, 2, 16, 21, 51, 283359)]]}
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Device motion namespace: http://www.isapi.org/ver20/XMLSchema
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Tamper Detection 1: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Tamper Detection.1
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Tamper Detection 2: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Tamper Detection.2
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Video Loss 1: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Video Loss.1
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Video Loss 2: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Video Loss.2
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Field Detection 1: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Field Detection.1
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Field Detection 2: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Field Detection.2
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Scene Change Detection 1: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Scene Change Detection.1
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Scene Change Detection 2: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Scene Change Detection.2
2022-06-02 16:21:51 DEBUG (SyncWorker_3) [pyhik.hikvision] Added update callback to <bound method HikvisionBinarySensor._update_callback of <Entity NVR Disk Full 0: off>> on 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Disk Full.0

But I also something more interesting. I added dirty custom debug logs to better understand what could be happening. image

The result is the following:

2022-06-02 17:04:48 DEBUG (Thread-3) [pyhik.hikvision] Device alerts namespace: http://www.isapi.org/ver20/XMLSchema
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] idtype: channelID
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] tree value: <Element '{http://www.isapi.org/ver20/XMLSchema}EventNotificationAlert' at 0xffff6415cae0>
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] tree value: b'<ns0:EventNotificationAlert xmlns:ns0="http://www.isapi.org/ver20/XMLSchema" version="2.0"><ns0:ipAddress>10.0.0.71</ns0:ipAddress><ns0:portNo>80</ns0:portNo><ns0:protocolType>HTTP</ns0:protocolType><ns0:macAddress>24:0f:9b:xx:xx:xx</ns0:macAddress><ns0:dynChannelID /><ns0:channelID /><ns0:dateTime>2022-06-02T17:04:38+02:00</ns0:dateTime><ns0:activePostCount>0</ns0:activePostCount><ns0:eventType>videoloss</ns0:eventType><ns0:eventState>inactive</ns0:eventState><ns0:eventDescription>videoloss alarm</ns0:eventDescription><ns0:channelName /></ns0:EventNotificationAlert>'
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] etype value: Video Loss
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] estate value: inactive
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] echid value: None
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] idtype: dynChannelID
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] tree value: <Element '{http://www.isapi.org/ver20/XMLSchema}EventNotificationAlert' at 0xffff6415cae0>
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] tree value: b'<ns0:EventNotificationAlert xmlns:ns0="http://www.isapi.org/ver20/XMLSchema" version="2.0"><ns0:ipAddress>10.0.0.71</ns0:ipAddress><ns0:portNo>80</ns0:portNo><ns0:protocolType>HTTP</ns0:protocolType><ns0:macAddress>24:0f:9b:xx:xx:xx</ns0:macAddress><ns0:dynChannelID /><ns0:channelID /><ns0:dateTime>2022-06-02T17:04:38+02:00</ns0:dateTime><ns0:activePostCount>0</ns0:activePostCount><ns0:eventType>videoloss</ns0:eventType><ns0:eventState>inactive</ns0:eventState><ns0:eventDescription>videoloss alarm</ns0:eventDescription><ns0:channelName /></ns0:EventNotificationAlert>'
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] etype value: Video Loss
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] estate value: inactive
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] echid value: None
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] idtype: inputIOPortID
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] idtype: dynInputIOPortID
2022-06-02 17:04:48 ERROR (Thread-3) [pyhik.hikvision] fetching attributes for etype Video Loss

As I understand it, the script is unable to get a proper channel id while enumerating the ID_TYPES.

So I just added a fallback channel ID as 0 (cf. my previous screenshot) and... I was able to get a valid event in Home Assistant for one of my field_detection sensor. 😀

Here's the complete log for the event:

2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] idtype: channelID
2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] tree value: <Element '{http://www.isapi.org/ver20/XMLSchema}EventNotificationAlert' at 0xffff54c17d10>
2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] tree value: b'<ns0:EventNotificationAlert xmlns:ns0="http://www.isapi.org/ver20/XMLSchema" version="2.0"><ns0:ipAddress>10.0.0.71</ns0:ipAddress><ns0:portNo>80</ns0:portNo><ns0:protocolType>HTTP</ns0:protocolType><ns0:macAddress>24:0f:9b:xx:xx:xx</ns0:macAddress><ns0:dynChannelID>1</ns0:dynChannelID><ns0:channelID>1</ns0:channelID><ns0:dateTime>2022-06-02T17:06:05+02:00</ns0:dateTime><ns0:activePostCount>1</ns0:activePostCount><ns0:eventType>fielddetection</ns0:eventType><ns0:eventState>active</ns0:eventState><ns0:eventDescription>fielddetection alarm</ns0:eventDescription><ns0:channelName>Camera 01</ns0:channelName><ns0:DetectionRegionList><ns0:DetectionRegionEntry><ns0:regionID>0</ns0:regionID><ns0:RegionCoordinatesList /><ns0:TargetRect><ns0:X>0.650000</ns0:X><ns0:Y>0.200000</ns0:Y><ns0:width>0.066000</ns0:width><ns0:height>0.176000</ns0:height></ns0:TargetRect></ns0:DetectionRegionEntry></ns0:DetectionRegionList><ns0:detectionPictureTransType>url</ns0:detectionPictureTransType><ns0:detectionPicturesNumber>1</ns0:detectionPicturesNumber><ns0:bkgUrl>http://10.0.0.71:80/picture/Streaming/tracks/103/?name=ch00001_00000000021005417420800xxxxxx&amp;size=721999</ns0:bkgUrl><ns0:URLCertificationType>digest</ns0:URLCertificationType></ns0:EventNotificationAlert>'
2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] etype value: Field Detection
2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] estate value: active
2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] echid value: 1
2022-06-02 17:06:16 ERROR (Thread-3) [pyhik.hikvision] fetching attributes for etype Field Detection
2022-06-02 17:06:16 DEBUG (Thread-3) [pyhik.hikvision] NVR Update: Field Detection, [True, 1, 1, datetime.datetime(2022, 6, 2, 17, 6, 16, 203685)]
2022-06-02 17:06:16 DEBUG (Thread-3) [pyhik.hikvision] Update callback <bound method HikvisionBinarySensor._update_callback of <Entity NVR Field Detection 1: on>> for sensor 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Field Detection.1
[...]
2022-06-02 17:06:25 DEBUG (Thread-3) [pyhik.hikvision] Updating stale event Field Detection on CH(1)
2022-06-02 17:06:25 DEBUG (Thread-3) [pyhik.hikvision] NVR Update: Field Detection, [False, 1, 1, datetime.datetime(2022, 6, 2, 17, 6, 25, 550692)]
2022-06-02 17:06:25 DEBUG (Thread-3) [pyhik.hikvision] Update callback <bound method HikvisionBinarySensor._update_callback of <Entity NVR Field Detection 1: off>> for sensor 484a3534-xxxx-xxxx-xxxx-240f9b31xxxx.Field Detection.1

So some progress made here. ☺

Mincka avatar Jun 02 '22 15:06 Mincka

Ok, while looking for proper videoloss event in this repo, I found out that this was a known issue: https://github.com/mezz64/pyHik/issues/45#issuecomment-556910415

@pete-leese Try to disable "Notify Surveillance Center" for "Video Loss" for all your cameras. image

Mincka avatar Jun 02 '22 15:06 Mincka

Anniversary duplicate of #45 (last activity with the workaround just one year ago), but it was interesting to debug anyway. I think a basic fall back like I did could be enough to fix it. Another better solution would be to avoid fetching the attributes if the channel ID is still None after the discovery loop since we know that the code will fail after. Thanks again for this package and good luck.

Mincka avatar Jun 02 '22 15:06 Mincka