Home Assistant custom component for the Comelit 6701W WiFi video intercom. Communicates via the ICONA Bridge TCP protocol — no cloud required.
Fork of mnestrud/comelit-man with fixes for Home Assistant's built-in go2rtc, door opening when Home Assistant's intercom sub-address differs from the relay output, and camera-driven intercom calls.
- Remote door opening — open doors/gates from Home Assistant
- Live intercom video — view the door camera stream directly in HA dashboards via local RTSP + WebRTC
- Two-way audio — hear the entrance and talk back from the doorbell card (mic requires an HTTPS origin — see below)
- Doorbell events — automations trigger on ring, missed call, or door opened; passive inbound video starts on ring without answering (other stations keep ringing until you do)
- Answer-station card — built-in WebRTC player using HA's native signaling; works on the local URL and remotely via Nabu Casa TURN
- Last-ring snapshot — image entity holding a JPEG captured as each ring's video starts
- 100% local — all call handling stays on your LAN; the cloud is only involved when you view remotely
- Comelit 6701W (or compatible ICONA Bridge device)
- Device accessible on your local network
- Home Assistant 2026.2.3+
Tested and confirmed working:
| Device | Firmware | Notes |
|---|---|---|
| Comelit 6701W | 2.x | All features — door open, video, doorbell events |
Likely compatible (same ICONA Bridge protocol):
- Other Comelit WiFi video door panels using the ICONA Bridge protocol on port 64100
- Compatibility is not guaranteed for devices with different firmware lines
The integration communicates via the ICONA Bridge TCP protocol on port 64100. If your device accepts TCP connections on that port and responds to UAUT/UCFG/CTPP messages, it is likely compatible.
- Add
https://github.com/Danimal4326/comelit-manas a custom repository (type: Integration) in HACS - Install Comelit Man
- Restart Home Assistant
- Copy the
custom_components/comelit_man/folder to your HAconfig/custom_components/directory - Restart Home Assistant
- Go to Settings → Devices & Services → Add Integration
- Search for Comelit Man
- Enter your device IP and either:
- Your device password (token will be extracted automatically), or
- A pre-extracted 32-character hex token
Create a dedicated user (recommended). Tick Create a dedicated user on the device and Home Assistant will provision its own account on the intercom and mint its own token, instead of reusing one that already belongs to a phone. This matters: the intercom allows only one listener per identity, so sharing a token with the Comelit app makes the two kick each other off. Requires a free user slot on the device (the wall monitor's slot is never touched).
After setup, you can configure the integration via Settings → Integrations → Comelit Man → Configure:
| Option | Default | Description |
|---|---|---|
| Enable notifications | On | Receive doorbell ring and door events. Disable if you only need video and door control, or to troubleshoot the notification connection. |
Changing this setting reloads the integration automatically.
- Single concurrent video session — only one video stream can be active at a time. Starting a second session stops the first.
- WiFi sleep — the 6701W disconnects from WiFi when idle (no active call). Wake it physically (ring the bell, or press a button) before testing network connectivity. The integration reconnects automatically once the device wakes.
- No cloud — requires direct LAN access to the device. Remote access via VPN or a reverse proxy is your responsibility.
- Fixed RTSP port — the integration uses a fixed RTSP port (8557). If another process is using that port at HA startup, the video feed will not work. Change the port in HA configuration or free up 8557.
- Door open timing — when video is active, pressing a door button opens the door then stops video after 10 seconds. This matches the Android app's behavior.
- Go to Settings → Devices & Services
- Find Comelit Man and open it
- Click the three-dot menu → Delete
- Confirm deletion
- Restart Home Assistant
The integration does not persist any state outside the config entry, so no manual cleanup is needed. The device's push-channel registration will lapse naturally once the keepalive probes stop.
| Entity | Description |
|---|---|
button.comelit_intercom_<door_name> |
Press to open a door or gate (e.g., button.comelit_intercom_actuator) |
button.comelit_intercom_start_video_feed |
Manually start the intercom video call |
button.comelit_intercom_stop_video_feed |
Stop the active video call |
camera.comelit_intercom_live_feed |
Live video stream from the door panel via local RTSP |
camera.comelit_intercom_<name> |
RTSP stream from each additional configured camera |
event.comelit_intercom_doorbell |
Fires ring, missed_call, and door_opened events for automations |
button.comelit_intercom_answer_doorbell |
Start two-way audio on an active inbound call |
image.comelit_intercom_last_ring_snapshot |
JPEG captured from video as the last ring arrived |
lock.comelit_intercom_<door_name> |
Same relay as the door button, with lock semantics for HomeKit/voice |
binary_sensor.comelit_intercom_ringing |
On for 30 s after a ring |
binary_sensor.comelit_intercom_connectivity |
Diagnostic — connection health |
sensor.comelit_intercom_last_ring |
Timestamp of the most recent ring (survives restarts) |
sensor.comelit_intercom_ring_count |
Cumulative ring count (survives restarts) |
Systems with more than one call origin also get a doorbell event entity per origin, created the first time that origin rings (a floor door appears as "Floor call"). Doors are exposed both as buttons and as locks — the buttons carry the stop-video-after-open behaviour and existing automations; the locks exist for HomeKit, voice assistants, and the lock card.
missed_call fires when a ring's passive video session ends without the Answer button being pressed (~2 minutes after the ring), or immediately if inbound video fails to start.
Two custom cards are automatically registered on startup — both are optional.
Intercom camera card — snapshot with play button overlay; click to start video, stops on navigation away:
type: custom:comelit-intercom-card
camera_entity: camera.comelit_intercom_live_feed
start_entity: button.comelit_intercom_start_video_feed # optional
stop_entity: button.comelit_intercom_stop_video_feedDoorbell answer-station card — a complete answer surface with a built-in WebRTC player. Video and entrance audio play through HA's native WebRTC signaling (camera/webrtc/* over the authenticated websocket), so it works identically on your local URL and remotely — ICE configuration, including Nabu Casa TURN when subscribed, comes from HA:
type: custom:comelit-doorbell-card
doorbell_entity: event.comelit_intercom_doorbell
camera_entity: camera.comelit_intercom_live_feed
answer_entity: button.comelit_intercom_answer_doorbell
stop_entity: button.comelit_intercom_stop_video_feed
door_entity: button.comelit_intercom_entrance_lock # optional — a button or lock entity
dismiss_after: 30 # optional, default 30sStates: Idle (thumbnail + doorbell badge) → Ringing (live video muted + Answer / Open Door / Dismiss) → Answered (video + entrance audio, mic chip, hang-up).
Two-way audio / microphone: browsers only allow microphone capture on a secure (HTTPS) origin — this is a Chromium rule with no workaround, and it applies inside the companion app too. In practice:
| Connection | See + hear | Talk back |
|---|---|---|
Local http:// URL |
✅ | ❌ — the card shows "mic needs HTTPS" |
| HTTPS (Nabu Casa remote, or local TLS) | ✅ | ✅ — tap the mic chip after Answer |
Pressing Answer unmutes entrance audio, tells the device to open its audio channel, and (on HTTPS) starts transmitting your mic. Latency for talk-back is bounded to well under a second.
When someone rings the doorbell, event.comelit_intercom_doorbell fires a ring event. Video starts automatically as a passive viewer — the call is not answered and other intercom stations keep ringing until you press Answer. Video sessions end on their own when nobody is watching. Use automations to send notifications, open the door, or take snapshots.
Basic notification:
alias: "Notify on doorbell ring"
mode: single
triggers:
- platform: state
entity_id: event.comelit_intercom_doorbell
to: "ring"
conditions: []
actions:
- action: notify.mobile_app_your_phone
data:
title: "Doorbell"
message: "Someone is at the door!"Notification with action button to open the camera view:
alias: "Doorbell ring with camera shortcut"
mode: single
triggers:
- platform: state
entity_id: event.comelit_intercom_doorbell
to: "ring"
conditions: []
actions:
- action: notify.mobile_app_your_phone
data:
title: "Doorbell"
message: "Someone is at the door!"
data:
actions:
- action: URI
title: "Open Camera"
uri: /lovelace/intercomAuto-start video on ring (opt-in):
If you want the video to start automatically when the doorbell rings:
alias: "Doorbell ring — notify and start video"
mode: single
triggers:
- platform: state
entity_id: event.comelit_intercom_doorbell
to: "ring"
conditions: []
actions:
- action: notify.mobile_app_your_phone
data:
title: "Doorbell"
message: "Someone is at the door!"
- action: button.press
target:
entity_id: button.comelit_intercom_start_video_feedThe integration uses a push-first, poll-for-health model:
| Mechanism | What it does | Frequency |
|---|---|---|
| VIP event listener | Receives doorbell ring, missed call, and door-opened events as binary messages on the CTPP channel | Instant (device pushes) |
| FCM keepalive probe | Re-sends push-info registration every 90 s; device ACKs, keeping the idle TCP connection alive | Every 90 s |
| Health-check poll | Verifies the TCP connection is still alive; triggers reconnect if not | Every 30 s |
| TCP disconnect callback | Schedules an immediate health-check when the client detects a TCP drop | Instant (on drop) |
Entity availability mirrors coordinator connectivity: all entities become unavailable if the device is unreachable and recover automatically on reconnect.
The ICONA Bridge protocol runs over raw TCP on port 64100. Every message has an 8-byte header:
[0x00 0x06] [body_length LE16] [request_id LE16] [0x00 0x00]
Key operations:
- Authentication: Open UAUT channel → send JSON access request with token → expect code 200
- Configuration: Open UCFG channel → request config → parse doors, cameras, addresses
- VIP events: Persistent CTPP channel — binary messages for doorbell ring, door opened, renewal ACK; replaces FCM-based PUSH for reliable local event delivery
- Door open (video active): Single
0x1840/0x000Dmessage on the existing video CTPP channel — PCAP-verified from Android app local traffic capture - Door open (VIP listener active, no video): Reuse open CTPP, fire open+confirm directly — no init overhead (~30 ms)
- Door open (notifications disabled): Open transient CTPP channel → full init → 6-step binary sequence → close
- Push channel: Registers FCM token; also used as a 90s keepalive probe — device ACKs with JSON, preventing false reconnect cycles
Full wire-format reference — framing, channels, CTPP events, call sequences, media transport, audio, and the Home Assistant WebRTC path — is in docs/PROTOCOL.md.
Add to configuration.yaml:
logger:
default: info
logs:
custom_components.comelit_man: debugThen restart HA. Debug logs include TCP connection events, channel opens, keepalive probes, VIP events, and video session lifecycle.
"Cannot connect" during setup
- Confirm the device is awake (ping it, or physically interact with it)
- Verify the IP address and that port 64100 is reachable (
telnet <ip> 64100) - Check your router's firewall isn't blocking local LAN traffic
Authentication failed
- If using a password, confirm it matches the device web interface password (default:
comelit) - Re-extract the token via the web interface:
http://<device-ip>:8080 - After a firmware update, the token may change — delete and re-add the integration
Video doesn't start
- Ensure no other app is using the ICONA Bridge (the device accepts only one TCP client at a time)
- Check HA logs for CTPP negotiation errors
- Port 8557 conflict: check if another process is using it (
netstat -an | grep 8557)
Doorbell events not firing
- Enable notifications in Settings → Integrations → Comelit Man → Configure
- The VIP listener requires an active CTPP channel; check logs for "Failed to start VIP event listener"
Entities show as unavailable
- The integration is reconnecting to the device; wait 30–60 s
- If it stays unavailable, check the device is on the network and debug logs for reconnect errors
Full history: CHANGELOG.md. Recent highlights:
- Dedicated device user — opt-in during setup: the integration creates its own account on the intercom and mints its own token, so Home Assistant and the Comelit app no longer kick each other off a shared identity
- Lock entities, ring sensors, per-caller doorbell entities — doors are also locks (HomeKit/voice), last-ring + ring-count sensors restore across restarts, and each call origin gets its own event entity
- Broader device support — apartment-block numeric addresses, kit-mode dropped prefixes, floor-call origin tag
- Fixed token auto-extraction — the backup scan matched
facerecognitionusers.cfginstead ofusers.cfg, breaking setup with a blank token field
- Two-way audio validated end-to-end — talk-back from the doorbell card to the entrance speaker, with transport-matched mic TX, 20 ms re-chunking, and PCMU→PCMA conversion
- Doorbell card is a full answer station — built-in WebRTC player over HA's native signaling; works locally and remotely (Nabu Casa TURN); mic on HTTPS origins
- Rings during an active call fire events; real missed-call detection; video ends when nobody is watching
- 1.2.0 — inbound video auto-starts on ring; audio sender wired to the answer flow
- 1.1.x — inbound call answer,
ringstandard event type, go2rtc backchannel groundwork - 1.0.x — first stable release; quality-scale hardening, strict typing, coverage
- 0.1.4 — breaking: entity IDs derive from the integration title (see CHANGELOG.md if upgrading from pre-1.0)
Protocol knowledge derived from community reverse-engineering efforts:
- ha-component-comelit-intercom by Nicolas Fricke
- comelit-client by Pierpaolo Follia
- Protocol analysis by grdw
Apache 2.0