Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d27343f
Migrate Hikvision integration to config flow with NVR support
ptarjan Dec 9, 2025
045f3bf
Address reviewer feedback: use _attr_name for entity naming
ptarjan Dec 9, 2025
8138cd3
Add YAML import flow for backward compatibility
ptarjan Dec 9, 2025
92e00cf
Add tests for YAML import flow
ptarjan Dec 9, 2025
7c4bf8b
Remove NVR helper function calls from setup
ptarjan Dec 9, 2025
dd500c1
Remove unused helpers.py file
ptarjan Dec 9, 2025
333556b
Apply suggestion from @mik-laj
ptarjan Dec 9, 2025
4b092d4
Fix ruff import sorting and remove unused import
ptarjan Dec 9, 2025
d43a646
Update requirements files
ptarjan Dec 9, 2025
3babc8c
Fix get_id to be method call instead of property
ptarjan Dec 9, 2025
196c372
Update generated files from hassfest
ptarjan Dec 9, 2025
6609001
python3 -m script.hassfest
ptarjan Dec 9, 2025
5594b43
Address reviewer feedback: move device class mapping to platform module
ptarjan Dec 9, 2025
91ad7af
Remove defusedxml from requirements
ptarjan Dec 9, 2025
5079d4a
Use specific exception type in __init__.py
ptarjan Dec 9, 2025
21f0904
Restore original PLATFORM_SCHEMA for YAML compatibility
ptarjan Dec 9, 2025
2c3becf
Convert entity creation to list comprehension
ptarjan Dec 9, 2025
89986f3
Remove unused self._entry in HikvisionBinarySensor
ptarjan Dec 9, 2025
721b507
Use specific exception type in config_flow.py
ptarjan Dec 9, 2025
a94f7e0
Remove reauth flow for follow-up PR
ptarjan Dec 9, 2025
c6e1dfe
Use CONF_NAME from YAML config for import title
ptarjan Dec 9, 2025
25bcac6
Use homeassistant domain for deprecated_yaml issue
ptarjan Dec 9, 2025
600fd7a
Fix tests for reviewer feedback changes
ptarjan Dec 9, 2025
39f5bc4
Remove incorrect coordinator comment
ptarjan Dec 9, 2025
50fa0fe
Combine mock_hikcamera fixtures and remove unnecessary MagicMock
ptarjan Dec 9, 2025
4b6bc2f
Improve config flow tests per reviewer feedback
ptarjan Dec 9, 2025
d1bb6f4
Simplify init tests per reviewer feedback
ptarjan Dec 9, 2025
0dfbfd1
Improve binary sensor tests per reviewer feedback
ptarjan Dec 9, 2025
8a4f84f
Add snapshot tests for binary sensor entities
ptarjan Dec 9, 2025
21eb000
Restore constants to original locations
ptarjan Dec 9, 2025
c11fb3f
Achieve 100% test coverage for hikvision integration
ptarjan Dec 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

88 changes: 87 additions & 1 deletion homeassistant/components/hikvision/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,87 @@
"""The hikvision component."""
"""The Hikvision integration."""

from __future__ import annotations

from dataclasses import dataclass
import logging

from pyhik.hikvision import HikCamera
import requests

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_HOST,
CONF_PASSWORD,
CONF_PORT,
CONF_SSL,
CONF_USERNAME,
Platform,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady

_LOGGER = logging.getLogger(__name__)

PLATFORMS = [Platform.BINARY_SENSOR]


@dataclass
class HikvisionData:
"""Data class for Hikvision runtime data."""

camera: HikCamera
device_id: str
device_name: str
device_type: str


type HikvisionConfigEntry = ConfigEntry[HikvisionData]


async def async_setup_entry(hass: HomeAssistant, entry: HikvisionConfigEntry) -> bool:
"""Set up Hikvision from a config entry."""
host = entry.data[CONF_HOST]
port = entry.data[CONF_PORT]
username = entry.data[CONF_USERNAME]
password = entry.data[CONF_PASSWORD]
ssl = entry.data[CONF_SSL]

protocol = "https" if ssl else "http"
url = f"{protocol}://{host}"

try:
camera = await hass.async_add_executor_job(
HikCamera, url, port, username, password
)
except requests.exceptions.RequestException as err:
raise ConfigEntryNotReady(f"Unable to connect to {host}") from err

device_id = camera.get_id()
Comment thread
ptarjan marked this conversation as resolved.
if device_id is None:
raise ConfigEntryNotReady(f"Unable to get device ID from {host}")

device_name = camera.get_name or host
device_type = camera.get_type or "Camera"

entry.runtime_data = HikvisionData(
camera=camera,
device_id=device_id,
device_name=device_name,
device_type=device_type,
)

# Start the event stream
await hass.async_add_executor_job(camera.start_stream)

await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)

return True


async def async_unload_entry(hass: HomeAssistant, entry: HikvisionConfigEntry) -> bool:
"""Unload a config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
# Stop the event stream
await hass.async_add_executor_job(entry.runtime_data.camera.disconnect)

return unload_ok
Loading
Loading