<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>𝐀𝐥𝐞𝐤𝐬𝐚𝐧𝐝𝐫 𝐌</title><author><name>𝐀𝐥𝐞𝐤𝐬𝐚𝐧𝐝𝐫 𝐌</name></author><id>https://teletype.in/atom/blacksli</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/blacksli?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@blacksli?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=blacksli"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/blacksli?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-29T16:15:43.499Z</updated><entry><id>blacksli:domofon_ufanet_home_assistant</id><link rel="alternate" type="text/html" href="https://teletype.in/@blacksli/domofon_ufanet_home_assistant?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=blacksli"></link><title>Открытие домофона Уфанет из home assistant</title><published>2025-11-21T15:13:51.965Z</published><updated>2025-11-21T15:14:39.097Z</updated><summary type="html">Спасибо @Hxhxkgsk за изучение механизмов уфанета и написание скрипта!!!</summary><content type="html">
  &lt;p id=&quot;yAYA&quot;&gt;Спасибо @Hxhxkgsk за изучение механизмов уфанета и написание скрипта!!!&lt;/p&gt;
  &lt;p id=&quot;ewpY&quot;&gt;1. Ставим интеграцию PythonScriptsPro&lt;br /&gt;https://github.com/AlexxIT/PythonScriptsPro&lt;/p&gt;
  &lt;p id=&quot;0hIj&quot;&gt;2. Создаем в папке config место хранения скрипта&lt;br /&gt;Например, я сделал /config/pythonScriptPro/&lt;/p&gt;
  &lt;p id=&quot;FAQ0&quot;&gt;3. Создаем в каталоге файлик, например ufanet_domofon.py&lt;br /&gt;и в него вносим сам скрипт. Таким образом у меня путь до скрипт получился &lt;br /&gt;/config/pythonScriptPro/ufanet_domofon.py&lt;/p&gt;
  &lt;p id=&quot;J7Aa&quot;&gt;Скрипт:&lt;/p&gt;
  &lt;pre id=&quot;sl0W&quot; data-lang=&quot;python&quot;&gt;import requests

def get_session_id(login, password):
    login_url = &amp;#x27;https://dom.ufanet.ru/login/&amp;#x27;
    data = {
        &amp;#x27;contract&amp;#x27;: login,
        &amp;#x27;password&amp;#x27;: password
    }
    session = requests.Session()
    response = session.post(login_url, data=data)
    if response.status_code == 200:
        cookies = session.cookies
        sessionid = cookies.get(&amp;#x27;sessionid&amp;#x27;)
        if sessionid:
            return sessionid

def open_door(login, password,domf_id):
    sessionid = get_session_id(login, password)
    url = f&amp;#x27;https://dom.ufanet.ru/api/v0/skud/shared/{domf_id}/open/&amp;#x27;
    coc = {&amp;#x27;sessionid&amp;#x27;:f&amp;#x27;{sessionid}&amp;#x27;}
    response = requests.Session().get(url=url,cookies=coc)
    
open_door(data[&amp;#x27;login&amp;#x27;], data[&amp;#x27;password&amp;#x27;],data[&amp;#x27;domf_id&amp;#x27;])
&lt;/pre&gt;
  &lt;p id=&quot;tUqF&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;f15a&quot;&gt;4. Идем на сайт &lt;a href=&quot;https://dom.ufanet.ru/&quot; target=&quot;_blank&quot;&gt;https://dom.ufanet.ru/&lt;/a&gt;  логинимся под логином, где есть домофон (логин пароль от договора и сайта my.ufanet.ru). На вкладке СКУД должны быть ваши доступные домофоны.&lt;br /&gt;Открываем в Chrome панель разработчика (F12) &lt;br /&gt;На вкладке элементы находим по Ctrl-F &amp;quot;data-skud&amp;quot; и должно найти элемент потипу:&lt;/p&gt;
  &lt;blockquote id=&quot;sp4I&quot;&gt;&amp;lt;a href=&amp;quot;#&amp;quot; role=&amp;quot;button&amp;quot; class=&amp;quot;btn btn-primary open-skud&amp;quot; data-skud=&amp;quot;1234&amp;quot; data-shared=&amp;quot;1&amp;quot;&amp;gt;Открыть&amp;lt;/a&amp;gt;&lt;/blockquote&gt;
  &lt;p id=&quot;HqPa&quot;&gt;Где 1234 и есть id домофона в системе уфанета который нам понадобится&lt;/p&gt;
  &lt;p id=&quot;rLlE&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Ue3F&quot;&gt;5. Остается вызывать скрипт.&lt;br /&gt;Для проверки в панели разработчика ХА вкладка действия прописываем скрипт действие&lt;/p&gt;
  &lt;pre id=&quot;EoEE&quot; data-lang=&quot;yaml&quot;&gt;action: python_script.exec
data:
  cache: false
  file: /config/pythonScriptPro/ufanet_domofon.py
  login: &amp;quot;1111111111&amp;quot;
  password: &amp;quot;2222222222&amp;quot;
  domf_id: &amp;quot;1234&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;ZLaW&quot;&gt;Где &lt;strong&gt;login &lt;/strong&gt;и &lt;strong&gt;password &lt;/strong&gt;это логин и пароль от ufanet.ru&lt;br /&gt;&lt;strong&gt;domf_id &lt;/strong&gt;- айди домофона который мы узнали чуть выше&lt;/p&gt;
  &lt;p id=&quot;Ab6k&quot;&gt;Проверяем, если сделали все верно то домофон должен открыться. &lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;3Es5&quot;&gt;6. Дальше с этим скриптом можно сделать что угодно, например, я сделал шаблонную кнопку, чтобы прокинуть на часы.&lt;br /&gt;Настройки - устройства - вспомогательное - создать - Template (или Шаблонный, у меня ХА пока прежний релиз, возможно перевод уже нормальный)&lt;br /&gt;- Шаблон кнопки&lt;/p&gt;
  &lt;p id=&quot;xhin&quot;&gt;Название как нам нужно&lt;br /&gt;Добавить действие - другие действия - выполнить действия. &lt;/p&gt;
  &lt;p id=&quot;kUkd&quot;&gt;&lt;br /&gt;И Приводим действие к виду по примеру выше. Сохраняемся.&lt;br /&gt;Кнопка появилась, её нажатие открывает домофон. &lt;/p&gt;
  &lt;p id=&quot;gpF1&quot;&gt;Также прокинул кнопки в Умный дом яндекс. &lt;/p&gt;
  &lt;p id=&quot;ZD5S&quot;&gt;&lt;strong&gt;&lt;u&gt;Еще раз спасибо @Hxhxkgsk!&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;u5yW&quot;&gt;&lt;strong&gt;&lt;u&gt;При перепечатке на другие ресурсы ссылка на оригинальный пост обязательна!&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;VRj3&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mn1l&quot;&gt;Так же можно завести камеры уфанет в Home Assistant&lt;/p&gt;
  &lt;p id=&quot;2MsS&quot;&gt;&lt;a href=&quot;https://teletype.in/@blacksli/cam_ufanet_in_home_assistant&quot; target=&quot;_blank&quot;&gt;https://teletype.in/@blacksli/cam_ufanet_in_home_assistant&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>blacksli:cam_ufanet_in_home_assistant</id><link rel="alternate" type="text/html" href="https://teletype.in/@blacksli/cam_ufanet_in_home_assistant?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=blacksli"></link><title>Камера Уфанет в Home Assistant</title><published>2025-11-21T14:58:39.040Z</published><updated>2025-12-24T07:39:33.057Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/44/0a/440a89a5-3c9f-43b4-8293-79d68ccc1b1b.png"></media:thumbnail><summary type="html">Благодарность Anton @simple1elf за метод!</summary><content type="html">
  &lt;p id=&quot;o42X&quot;&gt;&lt;strong&gt;UPDATE  &lt;/strong&gt;@AlexxIT  добавил поддержку в go2rtс  🥳&lt;br /&gt;&lt;a href=&quot;https://t.me/homassistant/971504&quot; target=&quot;_blank&quot;&gt;https://t.me/homassistant/971504&lt;br /&gt;&lt;/a&gt;как добавлять камеры описано тут, листаем до секции уфанет: &lt;a href=&quot;https://github.com/AlexxIT/go2rtc/blob/master/internal/expr/README.md&quot; target=&quot;_blank&quot;&gt;https://github.com/AlexxIT/go2rtc/blob/master/internal/expr/README.md&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;устаревший вариант (более не нужен, т.к. появилась поддержка камер уфанет в go2rtc)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;kxVp&quot;&gt;Благодарность Anton @simple1elf за метод!&lt;/p&gt;
  &lt;p id=&quot;mzMN&quot;&gt;Описание настроек go2rtc относятся к go2rtc установленному как &lt;strong&gt;аддон!&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;He3H&quot;&gt;&lt;u&gt;Если у вас другой тип установки go2rtc - расположение файлов будет другое, главное чтобы у go2rtc был доступ до файлов, ориентируйтесь на свой сервер.&lt;/u&gt;&lt;/p&gt;
  &lt;p id=&quot;kgyD&quot;&gt;Понадобится:&lt;br /&gt;1. логин пароль от Уфанет с доступом к https://ucams.ufanet.ru/  (можно будет подтянуть камеры которые там отображаются)&lt;br /&gt;2. &lt;a href=&quot;https://github.com/AlexxIT/go2rtc&quot; target=&quot;_blank&quot;&gt;go2rtc &lt;/a&gt;(например, аддоном)&lt;/p&gt;
  &lt;p id=&quot;C08X&quot;&gt;Порядок&lt;/p&gt;
  &lt;p id=&quot;t3aP&quot;&gt;1. Ищем нужные нам данные по камере. &lt;br /&gt;Заходим &lt;a href=&quot;https://ucams.ufanet.ru/&quot; target=&quot;_blank&quot;&gt;https://ucams.ufanet.ru/&lt;/a&gt; в браузере, напримере Chromе &lt;br /&gt;Видим наши камеры, нажимаем на просмотр, чтобы шел поток от камеры&lt;br /&gt;Жмякаем F12 чтобы попасть в консоль разработчика&lt;br /&gt;На вкладке сеть будет виден hls поток, копируем его URL &lt;/p&gt;
  &lt;p id=&quot;tt7p&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;qsye&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c4/35/c435095f-3972-46ad-96ac-5a6e53d6acf0.png&quot; width=&quot;609&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;I9j3&quot;&gt;Получаем ссылку подобную этой:&lt;/p&gt;
  &lt;p id=&quot;kD80&quot;&gt;&lt;a href=&quot;https://manul-9.cams.ufanet.ru/16161614917OJQ678/0/1643614917OJQ678-1763735924675-2615945.ts?token=eyJ0eXAiOiJKV1QiL&quot; target=&quot;_blank&quot;&gt;https://manul-9.cams.ufanet.ru/16161614917OJQ678/0/16434534534517OJQ678-17632342344675-2615945.ts?token=eyJ0eXAiOiJKV1QiL&lt;/a&gt;(и далее длинный токен)&lt;/p&gt;
  &lt;p id=&quot;2m64&quot;&gt;Нам понадобится номер сервера&lt;br /&gt;&lt;a href=&quot;https://manul-9.cams.ufanet.ru/16161614917OJQ678/0/1643614917OJQ678-1763735924675-2615945.ts?token=eyJ0eXAiOiJKV1QiL&quot; target=&quot;_blank&quot;&gt;manul&lt;strong&gt;-9&lt;/strong&gt;.cams.ufanet.ru&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;UjNY&quot;&gt;И номер камеры&lt;/p&gt;
  &lt;p id=&quot;nJET&quot;&gt;&lt;a href=&quot;https://manul-9.cams.ufanet.ru/16161614917OJQ678/0/1643614917OJQ678-1763735924675-2615945.ts?token=eyJ0eXAiOiJKV1QiL&quot; target=&quot;_blank&quot;&gt;manul-9.cams.ufanet.ru/&lt;strong&gt;16161614917OJQ678&lt;/strong&gt;/0/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;peOL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;A8yZ&quot;&gt;В home assistant  любым удобным способом попадаем в папку конфигурации и создаем папку &lt;strong&gt;ufanet_video&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;/config/&lt;strong&gt;ufanet_video&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;Внутри папки создаем файл&lt;strong&gt; ufanet_video.py &lt;br /&gt;&lt;/strong&gt;(полный путь будет &lt;strong&gt;&lt;em&gt;/config/ufanet_video/ufanet_video.py&lt;/em&gt;&lt;/strong&gt;)&lt;/p&gt;
  &lt;pre id=&quot;xR19&quot; data-lang=&quot;python&quot;&gt;import requests
import json
import os
import argparse
from datetime import datetime, timedelta

# Парсинг аргументов командной строки
parser = argparse.ArgumentParser(description=&amp;quot;Получение RTSP-ссылки с токеном для камеры Уфанет&amp;quot;)
parser.add_argument(&amp;quot;--camera-id&amp;quot;, required=True, help=&amp;quot;Идентификатор камеры&amp;quot;)
parser.add_argument(&amp;quot;--username&amp;quot;, required=True, help=&amp;quot;Имя пользователя (логин)&amp;quot;)
parser.add_argument(&amp;quot;--password&amp;quot;, required=True, help=&amp;quot;Пароль&amp;quot;)
parser.add_argument(&amp;quot;--manul-id&amp;quot;, default=&amp;quot;21&amp;quot;, help=&amp;quot;Идентификатор manul-сервера (по умолчанию: 21)&amp;quot;)
parser.add_argument(&amp;quot;--token-dir&amp;quot;, default=&amp;quot;/config/ufanet_video&amp;quot;, help=&amp;quot;Директория для хранения token.json (по умолчанию: /config/ufanet_video)&amp;quot;)

args = parser.parse_args()

camera_id = args.camera_id
credentials = {
    &amp;quot;username&amp;quot;: args.username,
    &amp;quot;password&amp;quot;: args.password
}
manul_id = args.manul_id
token_dir = args.token_dir

# Уникальное имя файла токена для каждой камеры + пользователя (защита от конфликтов)
safe_name = f&amp;quot;{args.username}_{camera_id}&amp;quot;.replace(&amp;quot;/&amp;quot;, &amp;quot;_&amp;quot;).replace(&amp;quot;\\&amp;quot;, &amp;quot;_&amp;quot;)
token_file = os.path.join(token_dir, f&amp;quot;token_{safe_name}.json&amp;quot;)

ttl_minutes = 30  # время жизни токена

def load_token_if_valid():
    if not os.path.exists(token_file):
        return None
    try:
        with open(token_file, &amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:
            data = json.load(f)
        token = data.get(&amp;quot;token&amp;quot;)
        obtained_at_str = data.get(&amp;quot;obtained_at&amp;quot;)
        if not token or not obtained_at_str:
            return None
        obtained_at = datetime.fromisoformat(obtained_at_str)
        if datetime.now() - obtained_at &amp;lt; timedelta(minutes=ttl_minutes):
            return token
        else:
            return None
    except (json.JSONDecodeError, ValueError, KeyError):
        return None

def save_token(token):
    token_info = {
        &amp;quot;token&amp;quot;: token,
        &amp;quot;obtained_at&amp;quot;: datetime.now().isoformat()
    }
    os.makedirs(token_dir, exist_ok=True)
    with open(token_file, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:
        json.dump(token_info, f, ensure_ascii=False, indent=4)

def get_new_token():
    session = requests.Session()
    response = session.post(&amp;quot;https://ucams.ufanet.ru/api/internal/login/&amp;quot;, data=credentials)
    if response.status_code != 200:
        raise Exception(f&amp;quot;Auth API error: {response.status_code} {response.text}&amp;quot;)

    sessionid = session.cookies.get(&amp;quot;sessionid&amp;quot;)
    cookies = {&amp;quot;sessionid&amp;quot;: sessionid}

    camera_payload = {
        &amp;quot;fields&amp;quot;: [&amp;quot;token_l&amp;quot;, &amp;quot;token_r&amp;quot;],
        &amp;quot;token_l_ttl&amp;quot;: 3600,
        &amp;quot;token_r_ttl&amp;quot;: 3600,
        &amp;quot;numbers&amp;quot;: [camera_id]
    }

    cam_response = requests.post(
        &amp;quot;https://ucams.ufanet.ru/api/v0/cameras/this/?lang=ru&amp;quot;,
        json=camera_payload,
        cookies=cookies
    )
    if cam_response.status_code != 200:
        raise Exception(f&amp;quot;Camera API error: {cam_response.status_code} {cam_response.text}&amp;quot;)

    result = cam_response.json()[&amp;quot;results&amp;quot;][0]
    return result[&amp;quot;token_l&amp;quot;]

# Основной поток
token = load_token_if_valid()
if token is None:
    token = get_new_token()
    save_token(token)

rtsp_url = f&amp;quot;rtsp://manul-{manul_id}.cams.ufanet.ru/{camera_id}?token={token}#audio=pcmu#video=h265&amp;quot;
print(rtsp_url)&lt;/pre&gt;
  &lt;p id=&quot;hiPc&quot;&gt;&lt;br /&gt;И сохраняем.&lt;/p&gt;
  &lt;p id=&quot;Tkma&quot;&gt;Сначала надо доустановить пакеты python, для этого добавляем в go2rtc stream&lt;/p&gt;
  &lt;pre id=&quot;1vY4&quot; data-lang=&quot;yaml&quot;&gt; streams:
  domofon3: | 
   echo: pip install requests -t /config/ufanet_video&lt;/pre&gt;
  &lt;p id=&quot;2RYj&quot;&gt;Сохраняем и открываем полученный поток на просмотр. Скачаются пакеты.&lt;/p&gt;
  &lt;p id=&quot;uMoG&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;0JSx&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1e/13/1e13b9ff-c4d4-40f1-bd85-36facf00c86d.png&quot; width=&quot;811&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vhMU&quot;&gt;Поток можно убрать, больше не понадобится.&lt;/p&gt;
  &lt;p id=&quot;wsIL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;WC00&quot;&gt;Добавляем в go2rtc источники, столько сколько надо камер  получить в ХА&lt;/p&gt;
  &lt;pre id=&quot;CGrr&quot; data-lang=&quot;yaml&quot;&gt;streams:
  domofon1: |
   echo: python3 /config/ufanet_video/ufanet_video.py --camera-id &amp;quot;111111111&amp;quot; --username &amp;quot;123123123&amp;quot; --password &amp;quot;321321&amp;quot; --manul-id &amp;quot;666&amp;quot;
  domofon2: |
   echo: python3 /config/ufanet_video/ufanet_video.py --camera-id &amp;quot;222222222&amp;quot; --username &amp;quot;123123123&amp;quot; --password &amp;quot;321321&amp;quot; --manul-id &amp;quot;777&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;BBbP&quot;&gt;Где:&lt;br /&gt; --camera-id &amp;quot;111111111&amp;quot;  &lt;br /&gt;1111111 = номер камеры, полученный выше&lt;/p&gt;
  &lt;p id=&quot;vXis&quot;&gt;--username &amp;quot;123123123&amp;quot; --password &amp;quot;321321&amp;quot;  &lt;br /&gt;логин пароль от сайта ucams.ufanet.ru &lt;/p&gt;
  &lt;p id=&quot;A051&quot;&gt;--manul-id &amp;quot;777&amp;quot;&lt;br /&gt;777  = номер сервера, полученный выше&lt;/p&gt;
  &lt;p id=&quot;pWD9&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mkZa&quot;&gt;Сохраняем, рестартим go2rtc&lt;/p&gt;
  &lt;figure id=&quot;sl35&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2a/e3/2ae3f6c4-4f1e-4caf-adfd-a096e8c7f0d4.png&quot; width=&quot;205&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SlOq&quot;&gt;&lt;br /&gt;И получаем потоки с камер уфанет&lt;/p&gt;
  &lt;figure id=&quot;fQXv&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f2/23/f22360b6-96cb-4e3c-8407-fcb136e8e93d.png&quot; width=&quot;258&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MaAm&quot;&gt;Например, rtsp://192.168.1.100:8554/domofon1&lt;br /&gt;Не забудьте сменить ip на свой&lt;/p&gt;
  &lt;p id=&quot;fAFe&quot;&gt;Поток можно проверить в видеоплеере VLC &lt;/p&gt;
  &lt;p id=&quot;yAYU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mKf2&quot;&gt;И всё это можно связать с открытием домофона из Home Assistant&lt;/p&gt;
  &lt;p id=&quot;HHGA&quot;&gt;&lt;a href=&quot;https://teletype.in/@blacksli/domofon_ufanet_home_assistant&quot; target=&quot;_blank&quot;&gt;https://teletype.in/@blacksli/domofon_ufanet_home_assistant&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>