Hikvision Doorbell addon "reject" API function doesn't work on DS-KV8113-WME1(C)

Hi,

I am using a Hikvision door station DS-KV8113-WME1(C) running firmware V2.2.78 and 3 Hikvision indoor stations DS-KH6320-WTE1 running firmware V2.2.100.

1 indoor station is configured as a main station connected to the door station and 2 indoor stations are extension stations connected to the main station.

To integrate Hikvision devices into Home Assistant I use the Hikvision Doorbell addon version 3.0.22.

I tried to get following automation working to automatically dismiss ringing state on my doorbell right after opening frontdoor. To achieve this I installed a tuya contact sensor to check if door is closed or open and trigger this automation when the sensor’s state changed. So there is no need to reject the call manually from one of the indoor stations:

alias: Hikvision TĂĽrklingel Anruf beenden
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.contact_sensor_2_tur
conditions:
  - condition: template
    value_template: >-
      {{ (as_timestamp(now()) -
      as_timestamp(states.sensor.door_station_call_state.last_changed)) < 30 }}
actions:
  - action: hassio.addon_stdin
    data:
      addon: aff2db71_hikvision_doorbell
      input: reject indoor_substation_dg
  - action: hassio.addon_stdin
    data:
      addon: aff2db71_hikvision_doorbell
      input: reject indoor_substation_og
  - action: hassio.addon_stdin
    data:
      addon: aff2db71_hikvision_doorbell
      input: reject indoor_station_eg
  - action: hassio.addon_stdin
    data:
      addon: aff2db71_hikvision_doorbell
      input: reject door_station
  - action: text.set_value
    target:
      entity_id: text.indoor_substation_dg_isapi_request
    data:
      value: >-
        PUT /ISAPI/VideoIntercom/callSignal?format=json
        {"CallSignal":{"cmdType":"reject"}}
  - action: text.set_value
    target:
      entity_id: text.indoor_substation_og_isapi_request
    data:
      value: >-
        PUT /ISAPI/VideoIntercom/callSignal?format=json
        {"CallSignal":{"cmdType":"reject"}}
  - action: text.set_value
    target:
      entity_id: text.indoor_station_eg_isapi_request
    data:
      value: >-
        PUT /ISAPI/VideoIntercom/callSignal?format=json
        {"CallSignal":{"cmdType":"reject"}}
  - action: text.set_value
    target:
      entity_id: text.door_station_isapi_request
    data:
      value: >-
        PUT /ISAPI/VideoIntercom/callSignal?format=json
        {"CallSignal":{"cmdType":"reject"}}

Here are the Hikvision Doorbell debug logs after the automation has been executed:

2025-06-10 00:35:59.935 | DEBUG    | event:_handle_callback:220 - Callback invoked from SDK
2025-06-10 00:35:59.935 | DEBUG    | event:_invoke_handlers:192 - Invoking 2 handlers
2025-06-10 00:35:59.935 | INFO     | event:video_intercom_alarm:120 - Video intercom alarm from Door Station
2025-06-10 00:35:59.935 | INFO     | mqtt:video_intercom_alarm:392 - Doorbell ringing, updating sensor 
settings: mqtt=MQTT(host='192.168.1.227', port=1883, username='mqtt', password='', client_name=None, tls_key=None, tls_certfile=None, tls_ca_cert=None, discovery_prefix='homeassistant', state_prefix='hmd') entity=SensorInfo(component='sensor', device=DeviceInfo(name='Door Station', model='DS-KV8113-WME1(C)', manufacturer='Hikvision', sw_version='V2.2.78', hw_version='0x0', identifiers='6883457586564949514587776949406741484950485052494850578282708254575553545149', connections=None, configuration_url=None), device_class=None, enabled_by_default=None, entity_category=None, expire_after=None, force_update=None, icon='mdi:bell', name='Call state', object_id='door_station_call_state', qos=None, unique_id='6883457586564949514587776949406741484950485052494850578282708254575553545149-call_state', unit_of_measurement=None, state_class=None) debug=False manual_availability=True
topic_prefix: sensor/Door-Station/Call-state
config_topic: homeassistant/sensor/Door-Station/Call-state/config
state_topic: hmd/sensor/Door-Station/Call-state/state
wrote_configuration: True
        
[2025-06-10 00:35:59.935][INF] Alarm[0] IP[192.168.1.135] data_len[568] alarm_len[568] status[430]
2025-06-10 00:36:08.047 | DEBUG    | input:loop_forever:39 - Received: reject indoor_substation_dg
2025-06-10 00:36:08.047 | INFO     | input:execute_command:114 - Rejecting the call
2025-06-10 00:36:08.047 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal": {"cmdType": "reject"}} 
[2025-06-10 00:36:08.051][INF] Private connect 192.168.1.33:8000 sock=278 this=0x331d6994 cmd=0x117001 port=40292
2025-06-10 00:36:08.059 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"statusCode":	"1",
	"statusString":	"OK",
	"subStatusCode":	"ok",
	"errorMsg":	"ok",
	"errorCode":	1
}
2025-06-10 00:36:08.059 | DEBUG    | input:loop_forever:39 - Received: reject indoor_substation_og
2025-06-10 00:36:08.059 | INFO     | input:execute_command:114 - Rejecting the call
2025-06-10 00:36:08.059 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal": {"cmdType": "reject"}} 
2025-06-10 00:36:08.060 | INFO     | mqtt_input:_isapi_input_callback:505 - Received input text for doorbell: Indoor Substation DG
2025-06-10 00:36:08.060 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal":{"cmdType":"reject"}} 
[2025-06-10 00:36:08.059][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[37], max segment length[262144]
[2025-06-10 00:36:08.065][INF] Private connect 192.168.1.136:8000 sock=278 this=0x331d6994 cmd=0x117001 port=38582
2025-06-10 00:36:08.072 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"statusCode":	"1",
	"statusString":	"OK",
	"subStatusCode":	"ok",
	"errorMsg":	"ok",
	"errorCode":	1
}
2025-06-10 00:36:08.072 | DEBUG    | input:loop_forever:39 - Received: reject indoor_station_eg
2025-06-10 00:36:08.072 | INFO     | input:execute_command:114 - Rejecting the call
2025-06-10 00:36:08.072 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal": {"cmdType": "reject"}} 
[2025-06-10 00:36:08.072][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[37], max segment length[262144]
[2025-06-10 00:36:08.075][INF] Private connect 192.168.1.17:8000 sock=278 this=0x331d6994 cmd=0x117001 port=50870
2025-06-10 00:36:08.082 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"statusCode":	"1",
	"statusString":	"OK",
	"subStatusCode":	"ok",
	"errorMsg":	"ok",
	"errorCode":	1
}
2025-06-10 00:36:08.082 | DEBUG    | input:loop_forever:39 - Received: reject door_station
2025-06-10 00:36:08.082 | INFO     | input:execute_command:114 - Rejecting the call
2025-06-10 00:36:08.082 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal": {"cmdType": "reject"}} 
2025-06-10 00:36:08.087 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"statusCode":	"1",
	"statusString":	"OK",
	"subStatusCode":	"ok",
	"errorMsg":	"ok",
	"errorCode":	1
}
[2025-06-10 00:36:08.078][INF] Private connect 192.168.1.33:8000 sock=281 this=0x331d6f78 cmd=0x117001 port=40300
[2025-06-10 00:36:08.082][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[37], max segment length[262144]
[2025-06-10 00:36:08.083][INF] Private connect 192.168.1.135:8000 sock=278 this=0x331d6994 cmd=0x117001 port=50080
[2025-06-10 00:36:08.087][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[35], max segment length[262144]
2025-06-10 00:36:08.088 | INFO     | mqtt_input:_isapi_input_callback:505 - Received input text for doorbell: Indoor Substation OG
2025-06-10 00:36:08.088 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal":{"cmdType":"reject"}} 
2025-06-10 00:36:08.089 | INFO     | mqtt_input:_isapi_input_callback:505 - Received input text for doorbell: Indoor Station EG
2025-06-10 00:36:08.089 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal":{"cmdType":"reject"}} 
2025-06-10 00:36:08.090 | INFO     | mqtt_input:_isapi_input_callback:505 - Received input text for doorbell: Door Station
2025-06-10 00:36:08.090 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal":{"cmdType":"reject"}} 
[2025-06-10 00:36:08.091][INF] Private connect 192.168.1.135:8000 sock=283 this=0x331d7b40 cmd=0x117001 port=50092
[2025-06-10 00:36:08.092][INF] Private connect 192.168.1.136:8000 sock=281 this=0x331d6f78 cmd=0x117001 port=38590
[2025-06-10 00:36:08.092][INF] Private connect 192.168.1.17:8000 sock=282 this=0x331d755c cmd=0x117001 port=50886
2025-06-10 00:36:08.098 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"statusCode":	"1",
	"statusString":	"OK",
	"subStatusCode":	"ok",
	"errorMsg":	"ok",
	"errorCode":	1
}
2025-06-10 00:36:08.099 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"statusCode":	"1",
	"statusString":	"OK",
	"subStatusCode":	"ok",
	"errorMsg":	"ok",
	"errorCode":	1
}
2025-06-10 00:36:08.102 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"requestURL":	"/ISAPI/VideoIntercom/callSignal",
	"statusCode":	1,
	"statusString":	"OK",
	"subStatusCode":	"ok"
}
[2025-06-10 00:36:08.098][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[35], max segment length[262144]
[2025-06-10 00:36:08.099][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[35], max segment length[262144]
[2025-06-10 00:36:08.102][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[37], max segment length[262144]
2025-06-10 00:36:08.108 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: {
	"requestURL":	"/ISAPI/VideoIntercom/callSignal",
	"statusCode":	1,
	"statusString":	"OK",
	"subStatusCode":	"ok"
}
[2025-06-10 00:36:08.108][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[35], max segment length[262144]
[2025-06-10 00:36:17.805][DBG] Alarm chan [0] recv timeout[2]!
2025-06-10 00:36:30.408 | DEBUG    | event:_handle_callback:220 - Callback invoked from SDK
2025-06-10 00:36:30.408 | DEBUG    | event:_invoke_handlers:192 - Invoking 2 handlers
2025-06-10 00:36:30.408 | INFO     | event:video_intercom_alarm:120 - Video intercom alarm from Door Station
2025-06-10 00:36:30.408 | INFO     | mqtt:video_intercom_alarm:395 - Call dismissed, updating sensor 
settings: mqtt=MQTT(host='192.168.1.227', port=1883, username='mqtt', password='', client_name=None, tls_key=None, tls_certfile=None, tls_ca_cert=None, discovery_prefix='homeassistant', state_prefix='hmd') entity=SensorInfo(component='sensor', device=DeviceInfo(name='Door Station', model='DS-KV8113-WME1(C)', manufacturer='Hikvision', sw_version='V2.2.78', hw_version='0x0', identifiers='6883457586564949514587776949406741484950485052494850578282708254575553545149', connections=None, configuration_url=None), device_class=None, enabled_by_default=None, entity_category=None, expire_after=None, force_update=None, icon='mdi:bell', name='Call state', object_id='door_station_call_state', qos=None, unique_id='6883457586564949514587776949406741484950485052494850578282708254575553545149-call_state', unit_of_measurement=None, state_class=None) debug=False manual_availability=True
topic_prefix: sensor/Door-Station/Call-state
config_topic: homeassistant/sensor/Door-Station/Call-state/config
state_topic: hmd/sensor/Door-Station/Call-state/state
wrote_configuration: True

The automation doesn’t stop ringing at all. There’s no change on doorbell ringing state. Ringing ends after 30 seconds timeout or after rejecting call manually.

I know that there’s usually no need to send “reject” command to all indoor stations and doorbell but I tried to send the request in 2 different ways (addon function and ISAPI function) to all devices to see if this makes a difference but it doesn’t.

I connected doorbell and indoor main station to Hik-Connect cloud service to see if this will solve the problem but it doesn’t.

What am I doing wrong?
Any help appreciated.

Update:
I discussed options with Pergola.Fabio but unfortunately there is no solution using his Hikvision Doorbell addon for the combination of my Hikvision devices.

But there is a solution using Hik-Connect HACS integration that works for me.

Before I could use it I had to add my main indoor station in Hik-Connect and install HACS Hik-Connect integration. It automatically adds a device for main indoor station to Home Assistant with several entities.

Here’s the automation I’m using now:

alias: Hikvision TĂĽrklingel Anruf beenden
description: ""
triggers:
  - trigger: state
    entity_id: binary_sensor.contact_sensor_2_tur
conditions: []
actions:
  - wait_template: "{{ not is_state('sensor.indoor_station_eg_call_status','unavailable') }} "
    continue_on_timeout: false
    timeout: "00:00:30"
  - if:
      - condition: template
        value_template: "{{ not is_state('sensor.indoor_station_eg_call_status','idle') }} "
    then:
      - action: button.press
        target:
          entity_id: button.indoor_station_eg_cancel_call
        data: {}
      - action: button.press
        target:
          entity_id: button.indoor_station_eg_answer_call
        data: {}
      - action: button.press
        target:
          entity_id: button.indoor_station_eg_hangup_call
        data: {}
mode: single

I need to call cancel first if the call hasn’t been answered by an indoor station or Hik-Connect app yet. If the call got answered already I have to call answer/hangup to stop it. That’s why these calls are in sequence in my automation.

Unfortunately HACS Hik-Connect integration loses contact to cloud every couple of seconds and automatically reestablish connection a second later.

That’s why I have to wait for a state other than “unavailable” in my automation to be sure to parse a real state.

The status flapping of HACS Hik-Connect integration stores thousands of state changes for the status entity in Home Assistant’s database.

But this solution was the best I could find so far.

Many thanks to Fabio for his idea to try Hik-Connect integration.

1 Like