Hikvision Doorbell / Videointercom integration

Mine is DS-KV8113-WME1(C)

1 Like

MAIN SUBJ: MULTIPLE BUTTONS WITH NO MONITOR
Hi Fabio, hi all, and thanks for your job.
I bought a DS-KV8413-WME1(C), V2.2.65 build 231213 (villa door station with 4 buttons) to run some testing for a 2 door 5 families multiple ha indoor stations. Some families need to control both doors.
I read that Dahua and Doorbird would have better integrations. Do you think I should move to those products?
While testing the Hikvision, my main issue is the need to identify which button is being pressed, not only which door station.
If I don’t mistake, my options are:

  • buying many hikvision indoor stations, at least one per family (so each button is polled on an indoor station);
  • going SIP without indoor stations.
    As my door station is not deployed yet, I could share it for some testing aroud the 4 buttons if anybody is interested (via static IP or VPN).

What you can do, try pressing the caller info button during a ring… I think it shows in the logs/attributes the floor/unit/building that’s being called…

If that works you can easily automate it

Thank you Fabio,
that’s what I’ve been hoping. But sadly, i get:

CallerInfo:
buildingNo: 1
floorNo: 1
zoneNo: 1
unitNo: 1
devNo: 1
devType: 1
lockNum: 1
no matter which button is being pressed.

I think I’ve read somewhere that this only specifies wich door station the ring comes from (floor/unit/building), but not what room it’s addressed to. It’s instead the indoor unit that reacts upon the specific button being pressed and polling the indoor station (which I don’t have, I only have ha) one can know what button is being pressed.

Is that correct or am I wrong?

Hmm. That’s not what I was hoping for :frowning:

Not sure if I can be any help now :frowning:

I have a look tomorrow in the SDK. To see if there is way to capture the button ID or something like that

Hey, can you stop addon and install 3.0.0-beta.118 addon ?

I added extra info to log, maybe its the devnumber we need:

            case VideoInterComAlarmType.DOORBELL_RINGING:
                dev_number = bytes(alarm_info.byDevNumber).split(b'\x00')[0].decode('utf-8')
                logger.info("Doorbell ringing, button press from: {}, updating sensor {}", dev_number, call_sensor)
                attributes = {
                    'equipment_number': dev_number,
                }

let me know results

************** New features

Guys, who wants to test? i have some new features added
now, when door is opened, you can also see if it was by card/code/face/… also the card number used is now present, the password not offcourse …
also added a backlight mode for outdoor …

new ideas are welcome …
you can test those features in the beta addon, just stop regular addon, copy over the config and start beta addon :slight_smile:

thnx!

2 Likes

@pergola.fabio any hint on required payload for callSignal on some models?

Hi all,
I’m troubleshooting ISAPI call signalling (Answer / HangUp / Reject) on a Hikvision video intercom/doorbell in Home Assistant using the Hikvision Doorbell / VideoIntercom add-on (MQTT entities).

  • callStatus works and returns JSON correctly, and callSignal/capabilities also returns the expected options.
  • But any PUT to /ISAPI/VideoIntercom/callSignal fails (so the add-on buttons Answer / Hangup / Reject don’t work).

Device: Hikvision DS-KV8213-WME1(C)], FW [V2.2.78 build 241012], Digest auth, HTTP port 80 reachable.

  • Working endpoints

call status OK

curl --digest -u “admin:***” -H “Accept: application/json”
“http:///ISAPI/VideoIntercom/callStatus?format=json”

capabilities OK

curl --digest -u “admin:***” -H “Accept: application/json”
“http:///ISAPI/VideoIntercom/callSignal/capabilities?format=json”

Example capabilities output:

{“CallSignal”:{“cmdType”:{“@opt”:[“request”,“cancel”,“answer”,“reject”,“bellTimeout”,“hangUp”,“deviceOnCall”]}}}

Failing endpoint

curl --digest -u “admin:***”
-H “Content-Type: application/json” -H “Accept: application/json”
-X PUT “http:///ISAPI/VideoIntercom/callSignal?format=json”
–data-binary ‘{“CallSignal”:{“cmdType”:“reject”}}’

Response (always 400):

{
“statusCode”: 6,
“statusString”: “Invalid Content”,
“subStatusCode”: “badXmlContent”,
“errorMsg”: “Wrong XMLcontent”
}

Sometimes I also get:

{“statusCode”:5,“statusString”:“Invalid Format”,“subStatusCode”:“badJsonFormat”,“errorMsg”:“bad json format”}

I also tested sending XML payloads, but I still get Wrong XMLcontent.

Question: on some models/firmwares, is src / target (or deviceId/devIndex / namespace+version in XML) actually required for /callSignal even if the public schema marks it optional?
Any known working payload example for a doorbell/intercom would be hugely appreciated.

Thanks!

you have 3 /// there and also missing the IP?
all those commands are already part of my addon, all integrated :slight_smile:
also you are sending as binary? dont think thats needed, just use data

remember, if you have an indoor station, commands needs to be sended to indoor, BUT they dont have port 80 open, so you need SDK to send those

here you can see the commands i use in the SDK:

anyone here with multiple buttons on the outdoor stations and using it to call different indoor stations?

1 Like

I do. One outdoor, multiple indoors (apartments). I have admin access to all units.

can you try to install the BETA addon, and do a ring do the different indoor stations?
i have added extra logging so we can hopefully if indoor A or B was called … now we only see the ring event

Installed it. Nothing is being reported in the logs when receiving a call. Any specific settings to change? (logging, call_state_poll, etc…)

You need to configure the outdoor station. Not indoor … It’s the outdoor station that should report what button was pressed :slight_smile:
It’s normal that indoor don’t provide ring alert …

Hi Fabio!

First off, thank you very much for working on this super useful addon!
I’ve been having fun with it for a few days now and I got stuck pretty close to the end, I think :slight_smile: I would appreciate a little help - I read a few months worth of posts here and saw a few messages about my kinda problem, but no solution, sadly.

Here’s my setup:

  • DS-KV8113-WME1(C) running the firmware you provided here recently (V3.7.0 build 251217)
  • no indoor station (i want to use a tablet with HA companion instead).

This is where I got:

  • go2rtc with HASS web proxy configured. Two way audio works through external WebRTC viewer
  • I have an automation based on changing call status working. It sends notification to my phone when I press the bell button on the doorstation.
  • I have advanced-camera-card configured, the video works and I can activate the relay

What I can’t get to work is the two-way audio through the Advanced Camera card. The buttons to mute/unmute buttons don’t seem to do anything (nothing shows up in the log). A call initiated from the doorstation gets into the logs, but I can’t answer or reject it on the Advanced Camera card.

The Advanced Camera card setup is fairly standard:

type: custom:advanced-camera-card
cameras:
  - live_provider: go2rtc
    go2rtc:
      url: http://172.24.101.14:1984
      stream: doorbell
menu:
  style: outside
  position: bottom
  buttons:
    microphone:
      enabled: true
      type: toggle
    screenshot:
      enabled: false
    download:
      enabled: false
    fullscreen:
      enabled: false
    snapshots:
      enabled: false
    timeline:
      enabled: false
    media_player:
      enabled: false
    clips:
      enabled: false
    live:
      enabled: false
    cameras:
      enabled: false
    iris:
      enabled: false
    camera_ui:
      enabled: false
live:
  microphone:
    always_connected: true
    mute_after_microphone_mute_seconds: 90
  auto_mute: []
  auto_unmute: []
  controls:
    builtin: true
    title:
      mode: none
  layout:
    fit: fill
elements:
  - type: custom:advanced-camera-card-menu-icon
    icon: mdi:volume-high
    tap_action:
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: unmute
  - type: custom:advanced-camera-card-menu-icon
    icon: mdi:volume-off
    tap_action:
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: mute
  - type: custom:advanced-camera-card-menu-icon
    icon: mdi:phone
    tap_action:
      - action: call-service
        service: button.press
        data:
          entity_id: button.furtka_answer_call
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: sleep
        duration:
          ms: 300
      - action: call-service
        service: button.press
        data:
          entity_id: button.furtka_hangup_call
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: sleep
        duration:
          ms: 200
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: unmute
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: microphone_unmute
  - type: custom:advanced-camera-card-menu-icon
    icon: mdi:phone-hangup
    tap_action:
      - action: custom:advanced-camera-card-action
        advanced_camera_card_action: microphone_disconnect
      - action: call-service
        service: text.set_value
        data:
          entity_id: text.furtka_isapi_request
          value: PUT /ISAPI/System/TwoWayAudio/channels/1/close
  - type: custom:advanced-camera-card-menu-icon
    icon: mdi:door-open
    hold_action:
      - action: call-service
        service: switch.turn_on
        data:
          entity_id: switch.furtka_door_1_relay
dimensions:
  aspect_ratio_mode: static
  aspect_ratio: "4:3"
status_bar:
  style: none

Log message for rejecting the call (regardless of whether the call was initiated):

2026-02-04 00:07:51.316 | INFO     | mqtt_input:_isapi_input_callback:534 - Received input text for doorbell: Furtka
2026-02-04 00:07:51.320 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/System/TwoWayAudio/channels/1/close  
[2026-02-04 00:07:51.337][INF] Private connect 172.24.103.5:8000 sock=47 this=0x80eabca0 cmd=0x117001 port=41234
2026-02-04 00:07:51.344 | DEBUG    | sdk.utils:call_ISAPI:165 - Response output: 
[2026-02-04 00:07:51.344][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/System/TwoWayAudio/channels/1/close], input size[0], max segment length[262144]

Log message for answering the call (regardless of whether the call was initiated):

2026-02-04 00:08:44.334 | INFO     | mqtt_input:_answer_call_callback:378 - Received answer command for doorbell: Furtka
2026-02-04 00:08:44.337 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal": {"cmdType": "answer"}} 
[2026-02-04 00:08:44.350][INF] Private connect 172.24.103.5:8000 sock=47 this=0x80eabca0 cmd=0x117001 port=40336
2026-02-04 00:08:44.360 | DEBUG    | sdk.utils:call_ISAPI:162 - Response status: {
	"statusCode":	6,
	"statusString":	"Invalid Content",
	"subStatusCode":	"badXmlContent",
[2026-02-04 00:08:44.360][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[37], max segment length[262144]
	"errorCode":	1610612739,
	"errorMsg":	"src"
}
2026-02-04 00:08:44.362 | ERROR    | mqtt_input:_answer_call_callback:391 - Error while answering call with ISAPI: ('Error while calling ISAPI /ISAPI/VideoIntercom/callSignal?format=json', 11, 'The data sent to the device is illegal, or the data received from the device error.  E.g. The input data is not supported by the device for remote configuration.')
2026-02-04 00:08:44.660 | INFO     | mqtt_input:_hangup_call_callback:355 - Received hangup command for doorbell: Furtka
2026-02-04 00:08:44.662 | DEBUG    | sdk.utils:call_ISAPI:125 - Call ISAPI request method url body: PUT /ISAPI/VideoIntercom/callSignal?format=json {"CallSignal": {"cmdType": "hangUp"}} 
[2026-02-04 00:08:44.683][INF] Private connect 172.24.103.5:8000 sock=47 this=0x80eabca0 cmd=0x117001 port=40342
2026-02-04 00:08:45.198 | DEBUG    | sdk.utils:call_ISAPI:162 - Response status: {
	"statusCode":	6,
	"statusString":	"Invalid Content",
	"subStatusCode":	"badXmlContent",
	"errorCode":	1610612739,
	"errorMsg":	"src"
}
2026-02-04 00:08:45.200 | ERROR    | mqtt_input:_hangup_call_callback:368 - Error while Hanging up the call with ISAPI: ('Error while calling ISAPI /ISAPI/VideoIntercom/callSignal?format=json', 11, 'The data sent to the device is illegal, or the data received from the device error.  E.g. The input data is not supported by the device for remote configuration.')
[2026-02-04 00:08:45.198][DBG] SimpleSTDCommandToDvr with out cmd[PUT /ISAPI/VideoIntercom/callSignal?format=json], input size[37], max segment length[262144]

I read in the comments here that “sometimes” an indoor station is necessary, but given that I have the 2-way audio tested through WebRTC, I don’t think it is my case, as it works already. I also read something similar about the Hik Connect connectivity (I’m not connected to the Hikvision cloud - I do have a local-only Hik Connect app on my phone, which works, though obviously without notifications).

Any help to push me forward will be very appreciated! I’m hoping that I won’t have to go the SIP way…

Well, if you press the doorbell button. And there is no hikconnect or indoor. What device is then actually ringing?? The callsignal commands only work when there is a real device ringing and it will stop the ring by sendjng a fake callsignal command…
I think that’s the reason why you see those fails…
Also answer+hanguo only works, when connected to cloud. Try to use reject instead and test when an actual device is ringing, in your case I think you are going to need hikconnect anyway (not sure)

I have also heard from other people, with that custom firmware some commands were broken. So to be 100% sure, maybe downgrade to the non 3.x version again?

Edit; if you see the ring event, what device is ringing then in your case? Maybe you don’t need to send the answer/hangup at all? Why not just use the microphone button and start two way audio?
The mute/unmute buttons don’t do anything offcourse when the microphone icon is not activated… Just press the mic button ? Will it change to red? Then you have activated the two way audio? No need to send then answer+hangup

When I press the doorbell button, no device is ringing. I just see the events in the log. After some 15 seconds, the doorstation goes “beep beep beep beep” (8 times, sounds like “busy” signal).

After I swapped the accept_call & hangup_call sequence for reject_call, if I press it after the doorbell button is pressed, the call is in fact rejected and the doorstation doesn’t do the “busy” beeping. However, the two way audio is not initiated. Not even after I press the microphone button - it doesn’t unmute, doesn’t turn red.

I may try to flash back an older firmware later this week, but it seems more like I’m having trouble with the Advanced Camera Card - that it doesn’t start the two-way audio.

Indeed ,I think it’s card related… You are using https right? Have you tried with a browser?

I wasn’t :frowning: That was the issue. Sorry, I have missed it in the how-to.

After setting up https for HA, it seems to be working fine! Even with no indoor station from Hikvision. I’ll keep testing and playing with it and will send feedback here if there’s something interesting.

Thanks a lot, Fabio!

1 Like

Hello @ all e ciao Fabio!
Grazie per aver sviluppato una integrazione del genere!
Ho installato il nuovo firmware V3.7.0 build 251217 ma, nonostante inserisca le credenziali che uso per loggarmi da browser sull’integrazione, mi restituisce questo:

`[2026-02-07 18:02:12.401][ERR] LogonDev1[192.168.1.32]
[2026-02-07 18:02:12.401][ERR] [192.168.1.32:8000]PRO_LoginHikDevice fail[err=10].[0x00000000,0x00000000]

[2026-02-07 18:02:12.401][ERR] CMemberMgrBase::AllocIndex2, MemberStart Failed, iIndex[0]
[2026-02-07 18:02:12.411][INF] COM_Logout[-1][1]

2026-02-07 18:02:13.698 | DEBUG | config:load_mqtt_config:131 - Loading MQTT configuration from supervisor

2026-02-07 18:02:13.699 | DEBUG | config:mqtt_config_from_supervisor:36 - Requesting MQTT service configuration to supervisor

2026-02-07 18:02:13.710 | DEBUG | main:main:31 - Importing Hikvision SDK
2026-02-07 18:02:13.712 | INFO | sdk.utils:loadSDK:44 - Using OS: Linux with architecture: x86_64

2026-02-07 18:02:13.712 | DEBUG | sdk.utils:loadSDK:57 - Loading library from lib-amd64/libhcnetsdk.so

2026-02-07 18:02:13.724 | DEBUG | main:main:35 - Hikvision SDK loaded

2026-02-07 18:02:13.724 | DEBUG | sdk.utils:setupSDK:86 - Initializing SDK
loop[2] find 2 mac and 3 ip

[2026-02-07 18:02:13.756][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[/lib/x86_64-linux-gnu/libz.so.1.2.11], hHandleRet[-821792288]

[2026-02-07 18:02:13.756][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.

[2026-02-07 18:02:13.756][INF] The COM:Core ver is 6.1.6.45, 2021_03_02. Async:1.

[2026-02-07 18:02:13.756][INF] This HCNetSDK ver is 6.1.6.45 Ver 2021_03_02.

2026-02-07 18:02:13.756 | DEBUG | sdk.utils:setupSDK:100 - SDK initialized

2026-02-07 18:02:13.756 | DEBUG | doorbell:init:62 - Setting up doorbell: videocitofono

2026-02-07 18:02:13.757 | DEBUG | doorbell:authenticate:70 - Logging into doorbell

[2026-02-07 18:02:13.757][INF] Login dev 192.168.1.32:8000.

[2026-02-07 18:02:13.757][INF] dwTotalNum[2048]

[2026-02-07 18:02:13.758][INF] Private connect 192.168.1.32:8000 sock=135 this=0xcf300c84 cmd=0x10000 port=56740

[2026-02-07 18:02:13.758][INF] LogonDev1 in[192.168.1.32:8000]

[2026-02-07 18:02:13.758][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[/app/lib-amd64/libcrypto.so], hHandleRet[-820606160]

[2026-02-07 18:02:13.758][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[/app/lib-amd64/libssl.so], hHandleRet[-820604928]

[2026-02-07 18:02:13.758][INF] SSLTRANSAPI::LoadAPI, libeay, Load Real Path[/app/lib-amd64/libcrypto.so]

[2026-02-07 18:02:13.758][INF] SSLTRANSAPI::LoadAPI, libssl, Load Real Path[/app/lib-amd64/libssl.so]

[2026-02-07 18:02:13.758][INF] SSLTRANSAPI::IsAllAPILoaded, OpenSSL_version Unload

[2026-02-07 18:02:13.758][INF] OpenSSL, Not All Function Loaded!

[2026-02-07 18:02:13.759][INF] SSLTRANSAPI::PrintVersion, SSLeay_version info [OpenSSL 1.0.2t 10 Sep 2019]

[2026-02-07 18:02:13.759][INF] CSSLTrans::SSLCtxInit, dwSSLVersion[0], m_fnClientMethodV23

2026-02-07 18:02:18.875 | ERROR | main:main_loop:100 - Error while logging into videocitofono: Timeout when receiving data from the device. Error code: 10
[2026-02-07 18:02:18.875][ERR] LogonDev1[192.168.1.32]

[2026-02-07 18:02:18.875][ERR] [192.168.1.32:8000]PRO_LoginHikDevice fail[err=10].[0x00000000,0x00000000]

[2026-02-07 18:02:18.875][ERR] CMemberMgrBase::AllocIndex2, MemberStart Failed, iIndex[0]

[2026-02-07 18:02:18.883][INF] COM_Logout[-1][1]`

Cosa sbaglio? Grazie!