3 Commits
Author SHA1 Message Date
sirmrak ff5406828c Создание структуры медиа-папок при инициализации интеграции
— _ensure_media_dirs(): базовые archives/ и screenshots/ создаются сразу в async_initialize
— _ensure_intercom_dirs(): подпапки per-intercom создаются после загрузки домофонов
— Папки готовы до первого события, не нужно ждать download_event_*
2026-06-28 17:53:51 +03:00
sirmrak c121261f3d Исправление media path: убрано двойное media, правильный HA API
— Default archive_path: 'media/RTKey' → 'RTKey' (без дублирования /media/media/)
— Fallback: '/media' → hass.config.path('media') (HA API вместо hardcoded)
— Поддержка ключа 'local' в media_dirs (если 'media' отсутствует)
— Обновлены подсказки в переводах en/ru
2026-06-28 17:31:02 +03:00
sirmrak 15a97be8e2 Оптимизация и модернизация __init__.py
— aiohttp вместо requests: реальный async, единая ClientSession, connection pooling
— async file I/O через executor (write_bytes, mkdir, cleanup)
— asyncio.gather для параллельного опроса событий
— asyncio.wait_for(timeout=5) на FFmpeg check
— CameraTokenInfo dataclass вместо dict
— yarl.URL для безопасной кодировки query-параметров
— Общие _api_get/_api_post, уменьшение дублирования
— CONF_ARCHIVE_DURATION вынесена в настройки
— Удалена бессмысленная ветка в get_intercoms_info
— _close_session() cleanup при unload
— sensor.py: archive_url → archive_path
— Обновлены переводы и config_flow для archive_duration
2026-06-28 17:14:49 +03:00
5 changed files with 475 additions and 382 deletions
File diff suppressed because it is too large Load Diff
+1
View File
@@ -19,6 +19,7 @@ from . import (
CONF_EVENT_SENSOR_ENABLED, CONF_EVENT_SENSOR_ENABLED,
CONF_ARCHIVE_PATH, CONF_ARCHIVE_PATH,
CONF_ARCHIVE_COPIES, CONF_ARCHIVE_COPIES,
CONF_ARCHIVE_DURATION,
CONF_SCREENSHOT_COPIES, CONF_SCREENSHOT_COPIES,
DATA_SCHEMA, DATA_SCHEMA,
OPTIONS_SCHEMA, OPTIONS_SCHEMA,
+3 -3
View File
@@ -100,9 +100,9 @@ class RTKeyEventSensor(SensorEntity):
"Тип события": self._event_data.get("event_type", ""), "Тип события": self._event_data.get("event_type", ""),
} }
archive_url = self._event_data.get("archive_url") archive_path = self._event_data.get("archive_path")
if archive_url: if archive_path:
attrs["Архив видео"] = archive_url attrs["Архив видео"] = archive_path
event = self._event_data.get("event", {}) event = self._event_data.get("event", {})
rfid = event.get("rfid") rfid = event.get("rfid")
+6 -2
View File
@@ -18,13 +18,15 @@
"event_sensor_enabled": "Create event sensor entity", "event_sensor_enabled": "Create event sensor entity",
"archive_path": "Archive storage path", "archive_path": "Archive storage path",
"archive_copies": "Number of video copies (0 = disabled)", "archive_copies": "Number of video copies (0 = disabled)",
"archive_duration": "Archive video duration (sec)",
"screenshot_copies": "Number of screenshot copies (0 = disabled)" "screenshot_copies": "Number of screenshot copies (0 = disabled)"
}, },
"data_description": { "data_description": {
"token": "Get token via browser developer tools (F12) on key.rt.ru", "token": "Get token via browser developer tools (F12) on key.rt.ru",
"camera_image_refresh_interval": "0 — disable periodic screenshots", "camera_image_refresh_interval": "0 — disable periodic screenshots",
"archive_path": "Relative to /media/ folder (e.g.: RTKey)", "archive_path": "Subfolder name inside HA media folder (e.g.: RTKey)",
"archive_copies": "Maximum number of saved videos per intercom", "archive_copies": "Maximum number of saved videos per intercom",
"archive_duration": "Duration of archived video fragment per event",
"screenshot_copies": "Maximum number of saved screenshots per intercom" "screenshot_copies": "Maximum number of saved screenshots per intercom"
} }
} }
@@ -49,13 +51,15 @@
"event_sensor_enabled": "Create event sensor entity", "event_sensor_enabled": "Create event sensor entity",
"archive_path": "Archive storage path", "archive_path": "Archive storage path",
"archive_copies": "Number of video copies (0 = disabled)", "archive_copies": "Number of video copies (0 = disabled)",
"archive_duration": "Archive video duration (sec)",
"screenshot_copies": "Number of screenshot copies (0 = disabled)" "screenshot_copies": "Number of screenshot copies (0 = disabled)"
}, },
"data_description": { "data_description": {
"token": "Get token via browser developer tools (F12) on key.rt.ru", "token": "Get token via browser developer tools (F12) on key.rt.ru",
"camera_image_refresh_interval": "0 — disable periodic screenshots", "camera_image_refresh_interval": "0 — disable periodic screenshots",
"archive_path": "Relative to /media/ folder (e.g.: RTKey)", "archive_path": "Subfolder name inside HA media folder (e.g.: RTKey)",
"archive_copies": "Maximum number of saved videos per intercom", "archive_copies": "Maximum number of saved videos per intercom",
"archive_duration": "Duration of archived video fragment per event",
"screenshot_copies": "Maximum number of saved screenshots per intercom" "screenshot_copies": "Maximum number of saved screenshots per intercom"
} }
} }
+6 -2
View File
@@ -18,13 +18,15 @@
"event_sensor_enabled": "Создавать сенсор последнего события", "event_sensor_enabled": "Создавать сенсор последнего события",
"archive_path": "Путь для сохранения архивов", "archive_path": "Путь для сохранения архивов",
"archive_copies": "Количество копий видео (0 = отключено)", "archive_copies": "Количество копий видео (0 = отключено)",
"archive_duration": "Длительность видео архива (сек)",
"screenshot_copies": "Количество копий скриншотов (0 = отключено)" "screenshot_copies": "Количество копий скриншотов (0 = отключено)"
}, },
"data_description": { "data_description": {
"token": "Получите токен в браузере через инструменты разработчика (F12) на сайте key.rt.ru", "token": "Получите токен в браузере через инструменты разработчика (F12) на сайте key.rt.ru",
"camera_image_refresh_interval": "0 — отключить периодические скриншоты", "camera_image_refresh_interval": "0 — отключить периодические скриншоты",
"archive_path": "Относительно папки /media/ (например: RTKey)", "archive_path": "Имя подпапки внутри медиа-папки HA (например: RTKey)",
"archive_copies": "Максимальное количество сохранённых видео на домофон", "archive_copies": "Максимальное количество сохранённых видео на домофон",
"archive_duration": "Длительность фрагмента видео архива на событие",
"screenshot_copies": "Максимальное количество сохранённых скриншотов на домофон" "screenshot_copies": "Максимальное количество сохранённых скриншотов на домофон"
} }
} }
@@ -49,13 +51,15 @@
"event_sensor_enabled": "Создавать сенсор последнего события", "event_sensor_enabled": "Создавать сенсор последнего события",
"archive_path": "Путь для сохранения архивов", "archive_path": "Путь для сохранения архивов",
"archive_copies": "Количество копий видео (0 = отключено)", "archive_copies": "Количество копий видео (0 = отключено)",
"archive_duration": "Длительность видео архива (сек)",
"screenshot_copies": "Количество копий скриншотов (0 = отключено)" "screenshot_copies": "Количество копий скриншотов (0 = отключено)"
}, },
"data_description": { "data_description": {
"token": "Получите токен в браузере через инструменты разработчика (F12) на сайте key.rt.ru", "token": "Получите токен в браузере через инструменты разработчика (F12) на сайте key.rt.ru",
"camera_image_refresh_interval": "0 — отключить периодические скриншоты", "camera_image_refresh_interval": "0 — отключить периодические скриншоты",
"archive_path": "Относительно папки /media/ (например: RTKey)", "archive_path": "Имя подпапки внутри медиа-папки HA (например: RTKey)",
"archive_copies": "Максимальное количество сохранённых видео на домофон", "archive_copies": "Максимальное количество сохранённых видео на домофон",
"archive_duration": "Длительность фрагмента видео архива на событие",
"screenshot_copies": "Максимальное количество сохранённых скриншотов на домофон" "screenshot_copies": "Максимальное количество сохранённых скриншотов на домофон"
} }
} }