<?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>Isaenkov.Pro</title><subtitle>Сложные решения домашней автоматизации</subtitle><author><name>Isaenkov.Pro</name></author><id>https://teletype.in/atom/isaenkov.pro</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/isaenkov.pro?offset=0"></link><link rel="alternate" type="text/html" href="https://isaenkov.pro/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=isaenkov.pro"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/isaenkov.pro?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-05T12:00:29.541Z</updated><entry><id>isaenkov.pro:bathroom-light-control</id><link rel="alternate" type="text/html" href="https://isaenkov.pro/bathroom-light-control?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=isaenkov.pro"></link><title>Лучшая автоматизация света в ванной | Node-RED, Home Assistant</title><published>2021-07-24T19:24:12.925Z</published><updated>2022-12-07T13:19:52.701Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/82/5e/825e4095-2fc0-48ea-b035-3c3990f2cea9.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/7f/03/7f0355e6-aaaf-4189-97e6-1552774d7024.png&quot;&gt;Казалось бы, простой вопрос: «Как сделать включение света автоматическим?». Решается это, действительно, очень просто. Но вот «Как сделать автоматическим, а, главное, корректным, его выключение?» — совсем не то же самое.</summary><content type="html">
  &lt;figure id=&quot;l5ZK&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7f/03/7f0355e6-aaaf-4189-97e6-1552774d7024.png&quot; width=&quot;1754&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tIrv&quot;&gt;Казалось бы, простой вопрос: «Как сделать включение света автоматическим?». Решается это, действительно, очень просто. Но вот «Как сделать автоматическим, а, главное, корректным, его выключение?» — совсем не то же самое.&lt;/p&gt;
  &lt;p id=&quot;3oZV&quot;&gt;Суть задачи сводится к определению наличия человека в помещении. И сейчас я покажу, как с нуля построить вот такой сценарий в Node-RED, используя датчик движения и датчик открытия двери.&lt;/p&gt;
  &lt;figure id=&quot;3F7E&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1c/07/1c07b2d8-8bcd-41fc-9d3f-45583bd650e3.png&quot; width=&quot;1826&quot; /&gt;
    &lt;figcaption&gt;Код всего Node-RED-flow доступен на &lt;a href=&quot;https://raw.githubusercontent.com/isaenkovpro/configs/master/006%2520Bathroom%2520Light%2520Control/nodered_flow.json&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TROm&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;vTCi&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/w4kYax-Pl5k?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ck7l&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;VJPu&quot;&gt;Ещё с самого начала пути внедрения умного дома в 2012 году мне никак не удавалось решить вторую часть этой головоломки, а именно — выключение света в ванной. Встроенные и сторонние инструменты создания сценариев в используемых тогда мною контроллерах не имели никаких шансов на это.&lt;/p&gt;
  &lt;ul id=&quot;p115&quot;&gt;
    &lt;li id=&quot;ME3Y&quot;&gt;&lt;strong&gt;Vera Lite&lt;/strong&gt; — любой более-менее сложный сценарий автоматизации на этом контроллере решался только с помощью сторонних модулей. Причём, насколько я помню, надёжностью это решение не очень отличалось.&lt;/li&gt;
    &lt;li id=&quot;vmY8&quot;&gt;&lt;strong&gt;Fibaro Home Center Lite&lt;/strong&gt; — это iPhone в мире контроллеров домашней автоматизации, только версии Lite. Красиво, просто, для хомячков. Сложные сценарии создавались путём дробления алгоритма на несколько частей с последующей их связкой. Но это не спасало, и для еще большей гибкости нужно было писать сценарии на языке LUA.&lt;/li&gt;
    &lt;li id=&quot;Z5Pl&quot;&gt;&lt;strong&gt;Raspberry Pi&lt;/strong&gt; — хардкорное решение с Raspbian и Domoticz. Такой инструмент как Blockly позволял реализовывать по-настоящему сложные вещи. Тогда мне казалось, что я решил поставленную задачу. Пусть с костылями и нагромождениями блоков. Но, нет, осечки и ложные выключения всё еще случались.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dzW3&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GkJD&quot;&gt;Лишь в 2018 году, когда я переехал на более-менее юзабельную версию Home Assistant, примерно 0.40, я познакомился с Node-RED — прекрасный, гибкий, мощнейший инструмент автоматизации. И в нём то я и обнаружил тот заветный компонент для решения моей задачи — state-machine.&lt;/p&gt;
  &lt;figure id=&quot;mtTv&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/61/4b/614b48e4-b18c-48d6-a91d-2b799f27138a.png&quot; width=&quot;507&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AVp5&quot;&gt;State-машина или Конечный автомат в рамках Node-RED — это нода, имеющая определённое количество состояний и триггеров, которые вызывают её переход из одного состояния в другое. В любой момент времени нода может находиться только в одном из состояний и переходить в другое лишь, когда сработает определённый для этого состояния триггер. Один и тот же триггер может быть использован для перехода более чем из одного состояния.&lt;/p&gt;
  &lt;p id=&quot;tPkW&quot;&gt;Вот схематичный пример того, как будет выглядеть будущий сценарий:&lt;/p&gt;
  &lt;figure id=&quot;hGui&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f9/34/f934ee65-2edc-458b-80f8-d53aa55659b9.png&quot; width=&quot;1674&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;4rEK&quot;&gt;
    &lt;li id=&quot;ookL&quot;&gt;Я открываю дверь (2) — свет включился.&lt;/li&gt;
    &lt;li id=&quot;k5SJ&quot;&gt;Захожу внутрь (3) — движение обнаружилось (4).&lt;/li&gt;
    &lt;li id=&quot;oQnf&quot;&gt;Закрываю дверь (5) и начинаю делать свои дела (6) — свет остаётся включённым, и при выполнении следующего условия по обнаружению движения (7), помещение помечается занятым (8). С этого момента свет сам не погаснет.&lt;/li&gt;
    &lt;li id=&quot;NjN6&quot;&gt;Выхожу из санузла (9) и закрываю дверь (5) — свет выключится через заданный промежуток времени (10).&lt;/li&gt;
    &lt;li id=&quot;ATRk&quot;&gt;Если оставить дверь открытой (2, 9, 14), то свет погаснет по таймауту после последнего события об отсутствии движения (11). Состояние помещения до тех пор не меняется.&lt;/li&gt;
    &lt;li id=&quot;N57B&quot;&gt;Если, находясь внутри, выключить свет выключателем (12), то при следующем обнаружении движения, он включится (13).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Fg2q&quot;&gt;Детальное описание сценария Node-RED доступно в &lt;a href=&quot;https://youtu.be/w4kYax-Pl5k?t=169&quot; target=&quot;_blank&quot;&gt;видео&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;QvtC&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;QbbU&quot;&gt;В примере показан сценарий с использованием датчика движения Fibaro.&lt;/p&gt;
  &lt;figure id=&quot;BJF0&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/cf/d5cf7c4f-5ccc-49f7-8c81-277c14fe6eb0.jpeg&quot; width=&quot;303&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LUN2&quot;&gt;В нём можно настраивать период, после которого контроллеру отправляется сообщение о том, что движения больше нет. Я поставил 15 секунд.&lt;/p&gt;
  &lt;p id=&quot;r7yO&quot;&gt;Если вместо него использовать, например, датчик от Aqara, то немного поменяется логика определения повторного движения для перехода в состояние «занято».&lt;/p&gt;
  &lt;figure id=&quot;w4mB&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cf/d4/cfd4aad8-1b5f-4413-96a1-a3173e8bbe39.jpeg&quot; width=&quot;301&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rZR5&quot;&gt;Так как он отправляет контроллеру статус о том, что движения больше нет, только спустя 1 минуту после последнего обнаружения, то 90 секунд, заданных в таймере в примере, гарантированно достаточно для того, чтобы точно определить наличие человека внутри, при условии, что дверь не открывалась.&lt;/p&gt;
  &lt;p id=&quot;Jk1S&quot;&gt;Еще пару лет с момента создания я неспешно доводил этот сценарий до ума, вылавливая разные редкие глюки и ложные срабатывания. Поэтому, кроме как лучшей, эту автоматизацию ни назвать.&lt;/p&gt;
  &lt;p id=&quot;ymz5&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;m2fQ&quot;&gt;Все конфигурации, описанные в статье, доступны на &lt;a href=&quot;https://github.com/isaenkovpro/configs/tree/master/006%20Bathroom%20Light%20Control&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>isaenkov.pro:water-softener-salt-level</id><link rel="alternate" type="text/html" href="https://isaenkov.pro/water-softener-salt-level?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=isaenkov.pro"></link><title>Умягчитель воды в доме: считаем остаток соли в баке | ESP8266</title><published>2021-07-24T18:50:46.311Z</published><updated>2022-12-07T13:20:43.952Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/37/9e/379e8947-13b4-4743-b09b-b4988ed03282.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/2a/d3/2ad33256-f502-4594-898d-530e97aa78ae.png&quot;&gt;В загородных домах часто используются умягчители воды, внутри которых находится фильтрующий материал (в моём случае — это ионообменная
смола), и который необходимо периодически промывать раствором
поваренной соли.</summary><content type="html">
  &lt;figure id=&quot;hMJy&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2a/d3/2ad33256-f502-4594-898d-530e97aa78ae.png&quot; width=&quot;1594&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;roMD&quot;&gt;В загородных домах часто используются умягчители воды, внутри которых находится фильтрующий материал (в моём случае — это ионообменная&lt;br /&gt;смола), и который необходимо периодически промывать раствором&lt;br /&gt;поваренной соли.&lt;/p&gt;
  &lt;p id=&quot;PGLT&quot;&gt;Основной процедурой обслуживания умягчителя является — пополнение солевого бака. Сейчас я расскажу о том, как я сделал отображение в Home Assistant примерного остатка соли и настроил уведомление о необходимости пополнения бака.&lt;/p&gt;
  &lt;figure id=&quot;vbN0&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/RquFeXZ_I5c?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PcrZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;877O&quot;&gt;Мой умягчитель настроен на промывку смолы через каждые 5 кубов потреблённой воды. И 50-ти кг соли, которые я засыпаю в бак, хватает примерно на 5-6 циклов промывки. Поэтому, первым делом, я думал подключиться к контроллеру для подсчета этих циклов, но в нём не нашлось никакой штатной возможности для этого.&lt;/p&gt;
  &lt;figure id=&quot;91Av&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/87/2e/872e3f1f-bb2e-4b70-9090-28237b325a9c.png&quot; width=&quot;1391&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fRsJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;YLe0&quot;&gt;Дальше я захотел применить ультразвуковой датчик для измерения расстояния. Но опыт использования во влажной среде показал, что работают они не дольше&lt;br /&gt;нескольких месяцев, после чего выходят из строя из-за коррозии. А бак с солью – это очень даже влажная среда.&lt;/p&gt;
  &lt;figure id=&quot;0Dfc&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7e/9a/7e9a9bb6-87f7-4346-bc28-b6039dd84c27.jpeg&quot; width=&quot;226&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3umq&quot;&gt;Поэтому я остановился на варианте с косвенным подсчетом уровня соли через мониторинг потребления воды. Благо, у счетчика оказался в наличии импульсных выход, и можно вести подсчёт с точностью до 1 литра. Опытным путём я выяснил, что соль нужно досыпать в бак примерно через каждые 30 кубов потреблённой воды.&lt;/p&gt;
  &lt;figure id=&quot;LNPV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/09/02093e1c-096f-4ea7-89f9-7a0eadb63ae1.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;B1CK&quot;&gt;Идея следующая: когда я открываю крышку для пополнения бака, показания счетчика воды фиксируются, и начинается отсчёт 30-ти кубов, по достижении&lt;br /&gt;которых я получаю уведомление. При следующем открывании крышки цикл повторяется вновь.&lt;/p&gt;
  &lt;p id=&quot;GnnU&quot;&gt;Для реализации задуманного я задействовал устройство на базе ESP8266, которое спаял несколько лет назад для подключения двух счётчиков&lt;br /&gt;воды. Ранее на нём была прошивка NodeMCU с написанным мною кодом. Теперь я загрузил в него прошивку ESPHome, которая изначально была создана для тесного взаимодействия с Home Assistant через API.&lt;/p&gt;
  &lt;figure id=&quot;PWC7&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9c/a5/9ca5b4c2-7e4c-4df9-b73a-351244f50cbe.jpeg&quot; width=&quot;2878&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;XE7N&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;8df9&quot;&gt;Схема подключения&lt;/h3&gt;
  &lt;figure id=&quot;iAY2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4f/13/4f132899-5ac9-400f-a98e-c38a250d2c92.png&quot; width=&quot;685&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VcSW&quot;&gt;Один из проводов счетчика и датчика открытия вместе подключаются к пину Ground. Каждый оставшийся провод подключается к свободному цифровому пину платы, кроме GPIO0 и 2, чтобы не возникла проблема с загрузкой. Также добавляется подтягивающий резистор по схеме. Для дополнительной защиты от дребезга контактов можно добавить конденсатор.&lt;/p&gt;
  &lt;p id=&quot;RhYS&quot;&gt;Вообще для упрощения подключения питания и прошивки модуля я бы рекомендовал использовать готовую плату вроде Wemos D1 mini.&lt;/p&gt;
  &lt;figure id=&quot;th11&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c9/56/c9569b6e-7a55-49d2-ae2f-f4d9c91bf902.png&quot; width=&quot;263&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DclT&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;J8Nw&quot;&gt;Прошивка&lt;/h3&gt;
  &lt;p id=&quot;3gJa&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;IuOr&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/97/a2/97a298a1-b0e8-40a4-9be0-6d807557446b.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aZJp&quot;&gt;ESPHome — это система для настройки модулей ESP8266 и ESP32 с помощью простых и мощных конфигурационных файлов, и удаленного управления ими с помощью систем домашней автоматизации.&lt;/p&gt;
  &lt;p id=&quot;Jrgv&quot;&gt;Код конфигурации модуля ESP представлен ниже:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;roB1&quot;&gt;esphome:
  name: esp-watercounter
  platform: ESP8266
  board: d1_mini
  on_boot:
    - logger.log: &amp;quot;Wait for MQTT connected&amp;quot;
    - wait_until:
        mqtt.connected:
    - delay: 3s
    - if:
        condition:
          mqtt.connected:
        then:
        - globals.set:
            id: water_count_var
            value: !lambda |-
              return id(water_counter).state;

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  manual_ip:
    static_ip: 172.16.1.120
    subnet: 255.255.255.0
    gateway: 172.16.1.1
    dns1: 172.16.1.1

logger:
api:
ota:

mqtt:
  broker: !secret mqtt_host
  username: !secret mqtt_user
  password: !secret mqtt_pass
  discovery: false

globals:
  - id: water_count_var
    type: int
    restore_value: no

time:
  - platform: sntp
    on_time:
      - seconds: 0
        minutes: /5
        then:
          - if:
              condition:
                lambda: |-
                  return id(water_count_var) &amp;gt; 0;
              then:
              - mqtt.publish:
                  topic: /pantry/watercounter
                  retain: true
                  payload: !lambda |-
                    return to_string(id(water_count_var));

binary_sensor:
  - platform: gpio
    name: &amp;quot;Pantry Tank cap&amp;quot;
    device_class: window
    pin:
      number: 5
      mode: INPUT_PULLUP
    filters:
      - delayed_on: 150ms
      - delayed_off: 150ms

  - platform: gpio
    name: &amp;quot;Pantry Water usage&amp;quot;
    id: water_usage
    internal: true
    pin:
      number: 4
      mode: INPUT_PULLUP
    filters:
      - delayed_on: 100ms
      - delayed_off: 100ms
    on_press:
      then:
        - if:
            condition:
              lambda: |-
                return id(water_count_var) &amp;gt; 0;
            then:
              - lambda: &amp;#x27;id(water_count_var) += 1;&amp;#x27;

sensor:
  - platform: mqtt_subscribe
    name: &amp;quot;Pantry Water count (L)&amp;quot;
    icon: &amp;quot;mdi:water-pump&amp;quot;
    id: water_counter
    accuracy_decimals: 0
    unit_of_measurement: &amp;#x27;L&amp;#x27;
    topic: /pantry/watercounter&lt;/pre&gt;
  &lt;p id=&quot;8NSd&quot;&gt;В секции wifi указываем статический IP-адрес, который будет назначен устройству после загрузки в него прошивки, либо позволяем DHCP-серверу назначить IP-адрес автоматом. Главное, не забыть затем зарезервировать его за конкретным устройством, во избежание возможной потери связи с Home Assistant.&lt;/p&gt;
  &lt;p id=&quot;raj3&quot;&gt;Имя точки доступа и пароль к ней записываю в виде секретов в отдельном окне редактора.&lt;/p&gt;
  &lt;figure id=&quot;5kTR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ae/f1/aef1d39c-2891-4344-9085-8caf13a12cee.png&quot; width=&quot;1803&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;O3y6&quot;&gt;Далее следуют параметры подключения к MQTT-брокеру. И основная часть — описание подключенных к модулю датчиков.&lt;/p&gt;
  &lt;p id=&quot;RAyj&quot;&gt;Геркон на крышке бака подключен к пятому цифровому пину, device_class: window будет передавать статус Открыто/Закрыто, вместо on/off.&lt;/p&gt;
  &lt;p id=&quot;mCth&quot;&gt;Счётчик воды подключен к 4-му пину, у него также есть защита от дребезга,&lt;br /&gt;а сам компонент помечен как внутренний, т. к. его отображение в Home Assistant не требуется, и его использование не выходит за пределы модуля ESP.&lt;/p&gt;
  &lt;p id=&quot;aISf&quot;&gt;Суть конфигурации сводится к следующему:&lt;/p&gt;
  &lt;ul id=&quot;A7UM&quot;&gt;
    &lt;li id=&quot;EhCy&quot;&gt;создаётся глобальная переменная, в которую записываются текущие показания счетчика, хранимые в mqtt-брокере.&lt;/li&gt;
    &lt;li id=&quot;Vxsm&quot;&gt;для счетчика прописана автоматизация, которая при замыкании контактов&lt;br /&gt;после каждого потреблённого литра воды, увеличивает значение глобальной переменной на этот самый 1 литр, а затем публикует обновлённое значение в mqtt-топике.&lt;/li&gt;
    &lt;li id=&quot;GtvF&quot;&gt;дополнительно создан сенсор, задача которого — отображать полученное из mqtt-топика значение показаний счетчика, т. к. этот сенсор уже будет виден в Home Assistant.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;L3tG&quot;&gt;После сборки и загрузки прошивки в модуль, его можно добавить в Home Assistant через меню интеграций:&lt;/p&gt;
  &lt;figure id=&quot;LWqq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/7a/967ac4f4-9b0e-4bd0-adbc-3b30eba03e7b.png&quot; width=&quot;701&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zkFm&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;3vNC&quot;&gt;Смотрим, что появились два новых устройства. И можно написать первый&lt;br /&gt;небольшой сценарий, в котором будут фиксироваться текущие показания счётчика воды для дальнейших расчётов:&lt;/p&gt;
  &lt;figure id=&quot;079z&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/e5/c1e51b27-9134-41a8-ad30-e3947ee6849b.png&quot; width=&quot;1570&quot; /&gt;
    &lt;figcaption&gt;Код всего Node-RED-flow доступен на &lt;a href=&quot;https://raw.githubusercontent.com/isaenkovpro/configs/master/003%2520Water%2520Softener%2520Salt%2520Level/nodered_flow.json&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qKWB&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;2tmn&quot;&gt;Проверяем, что крышка открыта, сбрасываем флаг, и считываем текущее значение показаний счетчика, которое публикуем в отдельный MQTT-топик. Сам счётчик добавлен как сенсор в Home Assistant:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;sr2L&quot;&gt;- platform: template
  sensors:
    pantry_water_count:
      friendly_name: &amp;quot;Pantry Water count&amp;quot;
      unit_of_measurement: &amp;#x27;m³&amp;#x27;
      icon_template: &amp;quot;mdi:water-pump&amp;quot;
      value_template: &amp;gt;-
          {% if states(&amp;#x27;sensor.pantry_water_count_l&amp;#x27;) in [&amp;#x27;unavailable&amp;#x27;, &amp;#x27;unknown&amp;#x27;, &amp;#x27;none&amp;#x27;] %}
            unavailable
          {% else %}
            {{ states(&amp;#x27;sensor.pantry_water_count_l&amp;#x27;)|float / 1000 }}
          {% endif %}&lt;/pre&gt;
  &lt;p id=&quot;ol1A&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;5hSI&quot;&gt;Для отображения зафиксированных показаний счётчика, при которых была открыта крышка бака, я создал другой сенсор:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;A9iT&quot;&gt;- platform: mqtt
  name: Pantry Tank last refill
  icon: mdi:basket-fill
  state_topic: &amp;quot;/pantry/watercounter/salt_refill&amp;quot;
  unit_of_measurement: &amp;quot;m³&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;b3Cq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;VXzK&quot;&gt;Непосредственно для расчёта остатка соли создал еще один сенсор на основе шаблона:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;jbF9&quot;&gt;- platform: template
  sensors:
    pantry_tank_salt_left:
      friendly_name: &amp;quot;Pantry Tank salt left&amp;quot;
      unit_of_measurement: &amp;quot;%&amp;quot;
      value_template: &amp;gt;-
        {% if 0 &amp;lt; ((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0) &amp;lt;= 100 %}
          {{ ((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0) }}
        {% elif ((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0) &amp;lt;= 0 %}
          0
        {% endif %}
      icon_template: &amp;gt;-
        {% if 60 &amp;lt; (((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0)) &amp;lt; 100 %}
          mdi:delete
        {% elif 30 &amp;lt; (((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0)) &amp;lt; 60 %}
          mdi:delete-outline
        {% elif 10 &amp;lt; (((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0)) &amp;lt; 30 %}
          mdi:delete-alert-outline
        {% elif (((30 - (states(&amp;#x27;sensor.pantry_water_count&amp;#x27;)|float - states(&amp;#x27;sensor.pantry_tank_last_refill&amp;#x27;)|float))/30*100) | round(0)) &amp;lt; 10 %}
          mdi:delete-forever-outline
        {% endif %}&lt;/pre&gt;
  &lt;p id=&quot;b79s&quot;&gt;В строке value_template происходит следующее:&lt;/p&gt;
  &lt;p id=&quot;0bws&quot;&gt;30 — полученный опытным путём примерный объем потреблённой воды, на который хватает одной засыпки соли. Сначала из этого объема вычитается разница между текущим значением показаний счётчика воды (sensor.pantry_water_count) и фиксированным значением (sensor.pantry_tank_last_refill), при котором засыпалась новая порция соли, а затем полученное округлённое значение преобразуется в проценты.&lt;/p&gt;
  &lt;p id=&quot;poA6&quot;&gt;Т.к. в MQTT-топике значения хранятся в виде строк, то в этих местах они преобразуются в числа с плавающей точкой (float).&lt;/p&gt;
  &lt;p id=&quot;B0Mz&quot;&gt;В icon_template описаны условия для отображения разных иконок в зависимости от текущего уровня соли.&lt;/p&gt;
  &lt;p id=&quot;Dm7P&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Bszz&quot;&gt;Сценарий для отправки уведомления делает следующее:&lt;/p&gt;
  &lt;p id=&quot;qElA&quot;&gt;Каждые 12 часов проверяется текущее значение уровня соли, которое записывается в отдельную переменную (msg.salt_level), проверяется состояние&lt;br /&gt;флага, который предотвращает повторную отправку уведомлений при следующей проверке, а сам является обычным виртуальным переключателем input_boolean:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;uCJa&quot;&gt;pantry_water_tank_refill_flag:
  name: Pantry Tank refill flag
  icon: mdi:delete-alert-outline&lt;/pre&gt;
  &lt;p id=&quot;XEwu&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Nwb8&quot;&gt;Следом в Function- ноде происходит проверка условий, что флаг (input_boolean) ещё не был включен, а остаток соли менее 10%, и далее включается флаг и формируется уведомление в Telegram, в текст которого подставляется переменная со значением остатка:&lt;/p&gt;
  &lt;figure id=&quot;kXDn&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/96/2b/962b8fd0-09a9-4738-a9d8-371bd9d71a37.png&quot; width=&quot;320&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EJLR&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;P8L0&quot;&gt;Вот так всё это выглядит в Home Assistant:&lt;/p&gt;
  &lt;figure id=&quot;gBEM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/87/0a/870aad82-05c8-47a9-b72e-569a42dcf6e6.png&quot; width=&quot;494&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mgb2&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mk2E&quot;&gt;Эту систему я тестировал и дорабатывал в течение нескольких месяцев, и сейчас она прекрасно справляется со своей задачей.&lt;/p&gt;
  &lt;p id=&quot;YFNf&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;4euM&quot;&gt;Все конфигурации, описанные в статье, доступны на &lt;a href=&quot;https://github.com/isaenkovpro/configs/tree/master/003%20Water%20Softener%20Salt%20Level&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>isaenkov.pro:heating-control-unit</id><link rel="alternate" type="text/html" href="https://isaenkov.pro/heating-control-unit?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=isaenkov.pro"></link><title>Контроллер системы отопления для умного дома | ESPHome, Home Assistant</title><published>2021-07-24T18:08:14.042Z</published><updated>2022-12-07T13:17:16.460Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/26/11/2611b66b-aa94-44c0-a874-235a763ca587.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/85/5e/855e3a5d-1d2b-4fa0-a4f7-b14b56f6bc01.png&quot;&gt;Одной из самых сложных для меня тем, которая вызывала много вопросов по реализации, была – регулировка температуры радиаторов отопления.</summary><content type="html">
  &lt;figure id=&quot;uYEX&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/85/5e/855e3a5d-1d2b-4fa0-a4f7-b14b56f6bc01.png&quot; width=&quot;1840&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ibqw&quot;&gt;Одной из самых сложных для меня тем, которая вызывала много вопросов по реализации, была – регулировка температуры радиаторов отопления.&lt;/p&gt;
  &lt;figure id=&quot;VyCU&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/wFwaG3vrZbc?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bUSm&quot;&gt;Лет 7 назад я установил на один из радиаторов термоголовку Danfoss с Z-Wave. И за пару месяцев использования, мне так и не удалось совладать с ней. Основными факторами, сыгравшими против, было то, что температура замерялась непосредственно возле радиатора и сильно отличалась от всего помещения. А также скорость реакции термоголовки на изменение уставки со стороны контроллера была неприемлемо низкой.&lt;/p&gt;
  &lt;figure id=&quot;lLCw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/59/15/5915c16d-e4f0-4bba-8dd3-bae67b26f179.jpeg&quot; width=&quot;1836&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2WQB&quot;&gt;Чуть позже я опробовал еще одно подобное устройство от Stella Z, но проблема с замером температуры непосредственно возле отопительного прибора никуда не делась.&lt;/p&gt;
  &lt;figure id=&quot;aW0O&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/0a/ab0adaa2-cd3b-4837-ae6d-2a4f13851fcf.jpeg&quot; width=&quot;500&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ktYW&quot;&gt;Да, существуют термоголовки от того же Danfoss с выносным термодатчиком,&lt;br /&gt;но выглядит это довольно ужасно. К тому же оставался вопрос, как подружить такое устройство с умным домом.&lt;/p&gt;
  &lt;p id=&quot;DRTx&quot;&gt;Спустя какое-то время Fibaro представили свою термоголовку с отдельным беспроводным датчиком температуры. И это уже выглядело интереснее предыдущих вариантов.&lt;/p&gt;
  &lt;figure id=&quot;DXRF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/33/b9/33b947e1-e15e-41fa-949b-f26f9d47bfbb.jpeg&quot; width=&quot;553&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nmuN&quot;&gt;К сожалению, это устройство обошло меня стороной.&lt;/p&gt;
  &lt;p id=&quot;s7rc&quot;&gt;Вновь к этой теме я вернулся, когда ручная регулировка температуры в доме стала доставлять массу неудобств, потому что приходилось крутить неудобные вентили на клапанах радиаторов.&lt;/p&gt;
  &lt;figure id=&quot;Qe3h&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fb/4d/fb4d8fc2-2af2-4d2e-a7dd-f8f65e6513eb.png&quot; width=&quot;1134&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ng6j&quot;&gt;Сначала я, конечно, вспомнил про Fibaro, но было неясно, как его нормально здесь использовать. При всём при этом стоимость всего мероприятия выходила бы совсем уж неприятной.&lt;/p&gt;
  &lt;p id=&quot;g6Kr&quot;&gt;В поисках решения, которое можно было бы приладить к моим радиаторам, я наткнулся на термоприводы для коллекторов отопления. И тут меня осенило. Зачем пытаться что-то регулировать в конечных точках, когда это можно сделать централизованно на коллекторе.&lt;/p&gt;
  &lt;figure id=&quot;qGxI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/55/6a/556a9096-969e-4a5f-983a-675a8eaa73c8.jpeg&quot; width=&quot;2700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0KvL&quot;&gt;Конкретно такие приводы имеют только два положения: открыто или закрыто.&lt;/p&gt;
  &lt;p id=&quot;C3tb&quot;&gt;Кстати, при желании, их всё же можно использовать на радиаторах, если на них&lt;br /&gt;установлен термостатический клапан с резьбой M30x1.5.&lt;/p&gt;
  &lt;figure id=&quot;AUJu&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5e/cb/5ecb4938-1262-4833-ab15-c435acef0ff6.jpeg&quot; width=&quot;357&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LbL5&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;z7MP&quot;&gt;Схема подключения&lt;/h3&gt;
  &lt;figure id=&quot;PdZt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/50/a4/50a4a77e-ee21-402a-9644-7629cfaee74d.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nP1y&quot;&gt;Все термоприводы — нормально-закрытые. Когда модуль ESP подаёт сигнал&lt;br /&gt;на твердотельное реле, термопривод открывается. Занимает это несколько минут.&lt;/p&gt;
  &lt;p id=&quot;0R7f&quot;&gt;В собранном виде контроллер вместе с реле и блоком питания помещается в какую-то стандартную распаячную коробку.&lt;/p&gt;
  &lt;figure id=&quot;b0aR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e0/99/e09929d1-b645-4c25-8426-751c4e7c02ed.jpeg&quot; width=&quot;4032&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pQCJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;bCRL&quot;&gt;Я решил не заморачиваться с установкой настенных термостатов, потому что&lt;br /&gt;всё ручное управление осуществляется с телефона или компьютера.&lt;/p&gt;
  &lt;figure id=&quot;dvjK&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/32/9f/329f85aa-8c63-4eb2-bf0d-45ae51f75be4.jpeg&quot; width=&quot;335&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bFCK&quot;&gt;В каждом помещении, где есть радиатор, я установил температурный датчик от Aqara, расположив их в местах, где предполагается самое частое присутствие людей.&lt;/p&gt;
  &lt;figure id=&quot;QkYg&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/a4/d2a48010-60bd-457e-9c72-6c18fdfa8ff8.jpeg&quot; width=&quot;300&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EoKO&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;IcSm&quot;&gt;Прошивка&lt;/h3&gt;
  &lt;p id=&quot;5OSW&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;IAtF&quot;&gt;Код для модуля ESP с прошивкой ESPHome также предельно простой. &lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;9mnD&quot;&gt;esphome:
  name: esp16-heating-control-unit-1
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  domain: !secret wifi_domain
  manual_ip:
    static_ip: 172.16.1.116
    subnet: 255.255.255.0
    gateway: 172.16.1.1
    dns1: 172.16.1.1

logger:
api:
ota:

dallas:
  - pin: 2

sensor:
  - platform: dallas
    address: 0xB1031635D6C6FF29
    name: &amp;quot;1 Heating Flow Temperature&amp;quot;

switch:
  - platform: gpio
    name: &amp;quot;Office Heater&amp;quot;
    icon: &amp;quot;mdi:radiator&amp;quot;
    pin: 16
    inverted: no
  - platform: gpio
    name: &amp;quot;Pantry Heater&amp;quot;
    icon: &amp;quot;mdi:radiator&amp;quot;
    pin: 14
    inverted: no
  - platform: gpio
    name: &amp;quot;Livingroom Heater&amp;quot;
    icon: &amp;quot;mdi:radiator&amp;quot;
    pin: 13
    inverted: no
  - platform: gpio
    name: &amp;quot;Kitchen Heater&amp;quot;
    icon: &amp;quot;mdi:radiator&amp;quot;
    pin: 12
    inverted: no&lt;/pre&gt;
  &lt;ul id=&quot;0uWj&quot;&gt;
    &lt;li id=&quot;Uasu&quot;&gt;Описывается каждый вывод, который подключен к реле (pin).&lt;/li&gt;
    &lt;li id=&quot;4JZM&quot;&gt;Если бы термопривод был нормально-открытый, то у параметра &lt;strong&gt;inverted&lt;/strong&gt; было бы значение &lt;em&gt;yes&lt;/em&gt;.&lt;/li&gt;
    &lt;li id=&quot;pKp4&quot;&gt;Опционально к коллектору прицеплен датчик температуры DS18B20.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Q2vM&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;u3OA&quot;&gt;После подключения модуля ESP к Home Assistant, в интерфейсе появляются выключатели, управляющие термоприводами. Но сами по себе они не имеют особой пользы.&lt;/p&gt;
  &lt;figure id=&quot;yADf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0c/bf/0cbf3caa-09db-4029-b3f5-bd38e451910d.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nlNR&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;6TNF&quot;&gt;На удивление, термостат, реализованный средствами &lt;a href=&quot;https://www.home-assistant.io/integrations/generic_thermostat/&quot; target=&quot;_blank&quot;&gt;базовой интеграции&lt;/a&gt; Home Assistant, обладает всем необходимым функционалом. А то я сначала собирался самостоятельно строить логику управления в Node-RED. Тут тоже всё просто:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;npKG&quot;&gt;- platform: generic_thermostat
  name: Livingroom Thermostat
  heater: switch.livingroom_heater
  target_sensor: sensor.livingroom_temperature
  min_temp: 23
  max_temp: 27
  ac_mode: false
  cold_tolerance: 0.3
  hot_tolerance: 0.1
  min_cycle_duration:
    minutes: 5
  initial_hvac_mode: &amp;quot;off&amp;quot;
  precision: 0.1&lt;/pre&gt;
  &lt;ul id=&quot;fjWi&quot;&gt;
    &lt;li id=&quot;fj3U&quot;&gt;указывается переключатель, управляющий термоприводом (heater)&lt;/li&gt;
    &lt;li id=&quot;kGlM&quot;&gt;датчик температуры, по которому термостат будет ориентироваться (target_sensor)&lt;/li&gt;
    &lt;li id=&quot;hCfl&quot;&gt;диапазон регулировки термостата (min_temp, max_temp)&lt;/li&gt;
    &lt;li id=&quot;DrYz&quot;&gt;гистерезис (cold_tolerance, hot_tolerance)&lt;/li&gt;
    &lt;li id=&quot;dTRW&quot;&gt;начальное состояние (initial_hvac_mode)&lt;/li&gt;
    &lt;li id=&quot;Q3Q9&quot;&gt;точность управления уставкой (precision)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;zzhL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;2Fpa&quot;&gt;По поводу начального состояния. После перезагрузки, все термостаты по умолчанию выключены. Есть отдельная автоматизация, которая при запуске Home Assistant проверяет, отопительный ли сейчас сезон, чтобы включить все термостаты:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;mbRk&quot;&gt;- id: &amp;#x27;1604184082358&amp;#x27;
  alias: Термостаты в отопительный сезон
  description: &amp;#x27;&amp;#x27;
  trigger:
  - platform: homeassistant
    event: start
  condition:
  - condition: state
    entity_id: input_boolean.heating_season
    state: &amp;#x27;on&amp;#x27;
  action:
  - service: homeassistant.turn_on
    data: {}
    entity_id: group.all_thermostats
  mode: single&lt;/pre&gt;
  &lt;p id=&quot;tA2f&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;zT03&quot;&gt;Проверка основывается на состоянии виртуального переключателя (input_boolean), которое зависит от среднесуточной температуры, собираемой с помощью встроенного &lt;a href=&quot;https://www.home-assistant.io/integrations/statistics/&quot; target=&quot;_blank&quot;&gt;модуля статистики&lt;/a&gt;:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;ixTG&quot;&gt;heating_season:
  name: Heating season
  icon: mdi:snowflake-melt&lt;/pre&gt;
  &lt;p id=&quot;r0e3&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;WPmU&quot;&gt;Показания температуры воздуха собираются с периодичностью 5 раз в час и хранятся 15 суток:&lt;/p&gt;
  &lt;figure id=&quot;zNI4&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b6/a0/b6a07298-f13e-4518-bec9-692d0d8c09f0.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MlGD&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;PFXQ&quot;&gt;В Node-RED для этого есть небольшой сценарий:&lt;/p&gt;
  &lt;figure id=&quot;q6Qd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/65/04/65041b76-61e0-4eda-a1f1-682852df8e85.png&quot; width=&quot;1009&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;02VX&quot;&gt;Что касается точности работы контроллера, то на примере графика за сутки видно, как при ночной уставке в 25.5 градусов, температура в кабинете колебалась в пределах двух десятых от нее:&lt;/p&gt;
  &lt;figure id=&quot;dd0r&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/10/ff/10ff1d91-9f68-4e20-9aad-b258830e7b3a.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cwyS&quot;&gt;Дневная температура 26 градусов также стабильно поддерживалась, за исключением моментов с попаданием в комнату прямых солнечных лучей.&lt;/p&gt;
  &lt;p id=&quot;JYav&quot;&gt;Выше — оранжевый график показывает, когда был открыт термопривод. И видно, как это совпадает с колебанием температуры в помещении.&lt;/p&gt;
  &lt;p id=&quot;v0jl&quot;&gt;Решение прекрасно пережило текущую зиму, и я остался доволен работой. Дополнительно написал пару сценариев для Node-RED, срабатывающих по времени суток или по присутствию.&lt;/p&gt;
  &lt;p id=&quot;6aCL&quot;&gt;Со стороны котла я решил не делать никаких подключений, так как максимум, на что он способен — включаться по внешнему сигналу, и это пока оказалось ненужным.&lt;/p&gt;
  &lt;p id=&quot;mR12&quot;&gt;Предвидя вопрос, «А что, если отключат свет?». Будет всё равно, потому что&lt;br /&gt;котёл тоже выключится. А, в случае, выхода из строя контроллера или термопривода, последний в одно движение снимается с коллектора.&lt;/p&gt;
  &lt;p id=&quot;XXJm&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;JgfE&quot;&gt;Все конфигурации, описанные в статье, доступны на &lt;a href=&quot;https://github.com/isaenkovpro/configs/tree/master/005 Heating control unit&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>isaenkov.pro:kodi-camera-preview</id><link rel="alternate" type="text/html" href="https://isaenkov.pro/kodi-camera-preview?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=isaenkov.pro"></link><title>Kodi: вывожу видео с камеры на TV при звонке в дверь</title><published>2021-07-17T19:10:18.067Z</published><updated>2022-12-07T13:21:28.300Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f4/3e/f43e25ed-5ab7-4d46-9513-54a0cfde049f.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/c0/dd/c0dd4352-1040-4deb-8f10-3ab7a84653e5.png&quot;&gt;В первом видео я упомянул об отображении потока с камеры на экране телевизора при звонке в дверь. Сегодня я продолжу эту тему и расскажу о настройке.</summary><content type="html">
  &lt;figure id=&quot;BcOv&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/dd/c0dd4352-1040-4deb-8f10-3ab7a84653e5.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Yvoy&quot;&gt;В первом видео я упомянул об отображении потока с камеры на экране телевизора при звонке в дверь. Сегодня я продолжу эту тему и расскажу о настройке.&lt;/p&gt;
  &lt;figure id=&quot;sqz4&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/nPGOyVoT3QU?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aXS1&quot;&gt;Для просмотра контента на телевизоре я использую медиа-центр Kodi, работающий на Raspberry Pi 3 с дистрибутивом &lt;a href=&quot;https://libreelec.tv&quot; target=&quot;_blank&quot;&gt;LibreELEC&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;rs5z&quot;&gt;Перед настройкой дополнений в Kodi необходимо включить опцию для возможности их установки из сторонних источников.&lt;/p&gt;
  &lt;figure id=&quot;KOXW&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2e/af/2eaf7b41-3a6a-4bc8-9e5c-2c25b51769c8.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kg2d&quot;&gt;А также изменить режим отображения настроек на &lt;strong&gt;Экспертный&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;yVtO&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a2/88/a288e91e-c0ab-4f80-9b40-a4e92c1a4133.png&quot; width=&quot;546&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ntxr&quot;&gt;Для вывода изображения с камеры, я установил &lt;a href=&quot;https://github.com/maikito26/repository.maikito26.storage/raw/master/plugin.video.surveillanceroom/plugin.video.surveillanceroom-1.2.3.zip&quot; target=&quot;_blank&quot;&gt;плагин Surveillance Room&lt;/a&gt;, предварительно загрузив архив на Raspberry Pi.&lt;/p&gt;
  &lt;p id=&quot;rjY3&quot;&gt;Следом поставил &lt;a href=&quot;https://github.com/joshjowen/script.json-cec/raw/master/script.json-cec.zip&quot; target=&quot;_blank&quot;&gt;плагин JSON-CEC&lt;/a&gt; для возможности управления телевизором через HDMI, чтобы иметь возможность переключения на Kodi с других источников&lt;br /&gt;сигнала. Главное, убедиться, что в настройках телевизора включена технология HDMI-CEC, потому что производителями она преподносится под разными торговыми названиями.&lt;/p&gt;
  &lt;figure id=&quot;WMcI&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/86/47/86476c18-212e-48b3-8292-a4b369b25ea2.png&quot; width=&quot;532&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tPYC&quot;&gt;В настройках дополнения включаю новую камеру, ввожу название и адреса&lt;br /&gt;основного видеопотока с камеры, MJPEG-потока для окна предпросмотра, и одиночного снимка.&lt;/p&gt;
  &lt;figure id=&quot;3XCZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/95/9a95ea7d-e5f9-49d1-ba0f-bc640ca4f2d5.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;VDua&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/28/b1/28b1ce55-13fe-4a85-9ba3-9152a81685c2.png&quot; width=&quot;1918&quot; /&gt;
    &lt;figcaption&gt;Параметры ниже меняю по своему усмотрению.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Gp1t&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;CagQ&quot;&gt;Теперь перехожу к настройке сценария в Node-RED.&lt;/p&gt;
  &lt;p id=&quot;Hzeh&quot;&gt;Я добавил новый блок с нодами, в которых происходит вызов различных действий в Kodi.&lt;/p&gt;
  &lt;p id=&quot;98dT&quot;&gt;Перед этим я предварительно настроил &lt;a href=&quot;https://www.home-assistant.io/integrations/kodi/&quot; target=&quot;_blank&quot;&gt;интеграцию&lt;/a&gt; медиа-плеера с Home Assistant и подключил его в качестве &lt;a href=&quot;https://www.home-assistant.io/integrations/kodi/#notifications&quot; target=&quot;_blank&quot;&gt;платформы для уведомлений&lt;/a&gt; согласно документации на сайте.&lt;/p&gt;
  &lt;p id=&quot;Q5TJ&quot;&gt;В первой ноде проверяется состояние медиа-плеера, проигрывается ли что-то&lt;br /&gt;на нём в данный момент или нет.&lt;/p&gt;
  &lt;figure id=&quot;iMoy&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/64/27643d73-9c08-4f2b-993f-5d626e29f4ff.png&quot; width=&quot;1707&quot; /&gt;
    &lt;figcaption&gt;Итоговый вид сценария претерпел изменения. Код обновлённого flow доступен ниже.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cWqs&quot;&gt;Если да, то через платформу уведомлений в Kodi создается всплывающее сообщение со следующим содержимым, где displaytime – это время отображения&lt;br /&gt;в мс.&lt;/p&gt;
  &lt;figure id=&quot;1lGd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3e/cc/3ecc498a-24db-4141-ad2f-c048f2afc741.png&quot; width=&quot;621&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yWt1&quot;&gt;Одновременно с этим на 30 секунд всплывает окно предпросмотра видеопотока&lt;br /&gt;с камеры, которое вызывается следующим запросом к плагину.&lt;/p&gt;
  &lt;figure id=&quot;h542&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/42/af/42afb186-9ecb-4519-871b-f8a724e57aa8.png&quot; width=&quot;600&quot; /&gt;
    &lt;figcaption&gt;Пример взят из &lt;a href=&quot;https://github.com/maikito26/plugin.video.surveillanceroom/blob/master/README.md&quot; target=&quot;_blank&quot;&gt;документации&lt;/a&gt; к плагину.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3x0o&quot;&gt;Далее следует задержка, где дополнительные 4 секунды отведены на запуск и остановку трансляции, после которой отдельным вызовом имитируется нажатие кнопки Назад, чтобы вернуться в исходную точку на экране, т. к. плагин сам этого почему-то не делает.&lt;/p&gt;
  &lt;p id=&quot;ETHJ&quot;&gt;В случае, когда на медиа-плеере ничего не запущено, то также создается всплывающее уведомление с текстом, и запускается уже полноэкранная&lt;br /&gt;трансляция видео с камеры, вызов которой отличается строкой с параметрами обращения к плагину.&lt;/p&gt;
  &lt;figure id=&quot;um43&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b6/30/b630a9dd-4f24-4206-8f0b-7ef247d7f3a6.png&quot; width=&quot;625&quot; /&gt;
    &lt;figcaption&gt;Пример взят из &lt;a href=&quot;https://github.com/maikito26/plugin.video.surveillanceroom/blob/master/README.md&quot; target=&quot;_blank&quot;&gt;документации&lt;/a&gt; к плагину.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;05tS&quot;&gt;А после задержки дополнительно происходит остановка трансляции.&lt;/p&gt;
  &lt;p id=&quot;zqiS&quot;&gt;Чтобы не создавать лишнюю активность в Kodi, когда телевизор выключен, я добавил дополнительную проверку. Она основана на состоянии бинарного сенсора, показывающего включен или выключен телевизор:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;9Ykt&quot;&gt;- platform: template
  sensors:
    livingroom_tv_state:
      friendly_name: &amp;quot;Livingroom TV State&amp;quot;
      value_template: &amp;quot;{{ states(&amp;#x27;media_player.cast_livingroom&amp;#x27;) != &amp;#x27;unknown&amp;#x27; and not(is_state(&amp;#x27;media_player.cast_livingroom&amp;#x27;, &amp;#x27;unavailable&amp;#x27;)) }}&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;suQL&quot;&gt;Сам сенсор является шаблоном, который смотрит на статус подключенного к телевизору Chromecast’а. Если Chromecast подключен к сети и доступен для воспроизведения контента, то телевизор считается включенным, потому что Chromecast воткнут в USB-порт телевизора, питание на котором появляется только при его включении. Сам Chromecast добавлен в Home Assistant через меню &lt;a href=&quot;https://www.home-assistant.io/integrations/cast/&quot; target=&quot;_blank&quot;&gt;интеграций&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;uiCg&quot;&gt;Полученный сценарий можно расширить, добавив большее количество медиа-центров Kodi, если таковые имеются. При этом, усложняется и схема.&lt;br /&gt;Для этого некоторые ноды размещаются друг за другом, где последовательно происходит считывание состояния каждого устройства.&lt;/p&gt;
  &lt;figure id=&quot;FhyL&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a4/22/a422a8f8-17bf-4db8-bd75-298227c66926.png&quot; width=&quot;613&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CbIP&quot;&gt;В двух блоках (TV status) состояние записывается в отдельную переменную.&lt;br /&gt;Далее проверяется состояние Kodi. И также, если проигрывается, создаётся новая переменная (Kodi status) со значением playing, если не проигрывается, то со значением, которое имеется на данный момент.&lt;br /&gt;С Chromecast’ом та же история (Cast status): если проигрывается — записывается playing, если не проигрывается — записывается текущее состояние.&lt;/p&gt;
  &lt;p id=&quot;VAgA&quot;&gt;В ноде Function (data) есть небольшой скрипт, который, в зависимости от состояния устройств, выполняет то или иное действие. Здесь есть несколько переменных, в которых указывается имя нотификатора, имя медиа-плеера Kodi и выключатель, который переключает источник сигнала на телевизоре на Kodi:&lt;/p&gt;
  &lt;figure id=&quot;HSHN&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2d/76/2d766912-505e-42a3-a9ec-05bb3dd76ddd.png&quot; width=&quot;881&quot; /&gt;
    &lt;figcaption&gt;Function-нода&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;iVRl&quot;&gt;switch.yaml:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;RKI6&quot;&gt;- platform: template
  switches:
    livingroom_tv_kodi:
      friendly_name: Livingroom TV Kodi
      value_template: &amp;quot;{{ is_state(&amp;#x27;switch.livingroom_tv_kodi&amp;#x27;, &amp;#x27;on&amp;#x27;) }}&amp;quot;
      icon_template: mdi:kodi
      turn_on:
        - service: script.kodi_livingroom_turn_on_action
        - service: switch.turn_off
          entity_id: switch.livingroom_tv_kodi
      turn_off:
        delay:
          seconds: 0&lt;/pre&gt;
  &lt;p id=&quot;Y6Mt&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;AamI&quot;&gt;scripts.yaml:&lt;/p&gt;
  &lt;pre data-lang=&quot;yaml&quot; id=&quot;klc3&quot;&gt;kodi_livingroom_turn_on_action:
  alias: Turn ON Livingroom TV HDMI to Kodi
  sequence:
  - data:
      addonid: script.json-cec
      entity_id: media_player.kodi_livingroom
      method: Addons.ExecuteAddon
      params:
        command: activate
    service: kodi.call_method&lt;/pre&gt;
  &lt;p id=&quot;PCHg&quot;&gt;Например, если в Kodi в данный момент что-то проигрывается, то скрипт идёт по первому пути, где вызывается всплывающее уведомление. Параллельно с этим воспроизведение ставится на паузу, и также параллельно с этим вызывается предпросмотр с камеры через плагин.&lt;/p&gt;
  &lt;p id=&quot;C576&quot;&gt;В случае, когда на медиа-центре Kodi ничего не воспроизводится, либо включен какой-то другой источник сигнала, то вызывается полноэкранный поток с камеры&lt;br /&gt;и происходит переключение источника сигнала на телевизоре на Kodi.&lt;/p&gt;
  &lt;p id=&quot;X7tq&quot;&gt;Здесь ещё также добавлена задержка, которая нужна, чтобы телевизор успел переключиться на Kodi, после чего создаётся всплывающее уведомление&lt;br /&gt;с характерным звуком.&lt;/p&gt;
  &lt;p id=&quot;OBnB&quot;&gt;Код всего Node-RED-flow представлен ниже:&lt;/p&gt;
  &lt;pre id=&quot;4gYn&quot;&gt;[{&amp;quot;id&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tab&amp;quot;,&amp;quot;label&amp;quot;:&amp;quot;Flow 2&amp;quot;,&amp;quot;disabled&amp;quot;:false,&amp;quot;info&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;9f016b89.edeb18&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;server-state-changed&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Звонок в дверь&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;exposeToHomeAssistant&amp;quot;:false,&amp;quot;haConfig&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;icon&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;}],&amp;quot;entityidfilter&amp;quot;:&amp;quot;switch.corridor_doorbell_ding&amp;quot;,&amp;quot;entityidfiltertype&amp;quot;:&amp;quot;substring&amp;quot;,&amp;quot;outputinitially&amp;quot;:false,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;haltifstate&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;outputs&amp;quot;:2,&amp;quot;output_only_on_state_change&amp;quot;:false,&amp;quot;for&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;forType&amp;quot;:&amp;quot;num&amp;quot;,&amp;quot;forUnits&amp;quot;:&amp;quot;minutes&amp;quot;,&amp;quot;ignorePrevStateNull&amp;quot;:false,&amp;quot;ignorePrevStateUnknown&amp;quot;:false,&amp;quot;ignorePrevStateUnavailable&amp;quot;:false,&amp;quot;ignoreCurrentStateUnknown&amp;quot;:false,&amp;quot;ignoreCurrentStateUnavailable&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;eventData&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;triggerId&amp;quot;}],&amp;quot;x&amp;quot;:100,&amp;quot;y&amp;quot;:160,&amp;quot;wires&amp;quot;:[[&amp;quot;96fbc9f0.88a2e8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;96fbc9f0.88a2e8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;rate&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;120&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:true,&amp;quot;x&amp;quot;:320,&amp;quot;y&amp;quot;:160,&amp;quot;wires&amp;quot;:[[&amp;quot;65c28ed9.0a8e6&amp;quot;,&amp;quot;eed3b3a.5d4555&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;65c28ed9.0a8e6&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;stoptimer&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;duration&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;units&amp;quot;:&amp;quot;Second&amp;quot;,&amp;quot;payloadtype&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;payloadval&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Timeout&amp;quot;,&amp;quot;x&amp;quot;:560,&amp;quot;y&amp;quot;:160,&amp;quot;wires&amp;quot;:[[&amp;quot;4a1d76bc.4213b8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;6a886333.f832cc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;telegram event&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Еще снимок&amp;quot;,&amp;quot;bot&amp;quot;:&amp;quot;f6e2842.9c49078&amp;quot;,&amp;quot;event&amp;quot;:&amp;quot;callback_query&amp;quot;,&amp;quot;autoanswer&amp;quot;:true,&amp;quot;x&amp;quot;:470,&amp;quot;y&amp;quot;:120,&amp;quot;wires&amp;quot;:[[&amp;quot;7d5306e4.b68658&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7d5306e4.b68658&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.content&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;RING MORE PIC&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:595,&amp;quot;y&amp;quot;:120,&amp;quot;wires&amp;quot;:[[&amp;quot;4a1d76bc.4213b8&amp;quot;]],&amp;quot;l&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;4a1d76bc.4213b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;http request&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;GET&amp;quot;,&amp;quot;ret&amp;quot;:&amp;quot;bin&amp;quot;,&amp;quot;paytoqs&amp;quot;:&amp;quot;ignore&amp;quot;,&amp;quot;url&amp;quot;:&amp;quot;http://192.168.1.51/ISAPI/Streaming/channels/101/picture?snapShotImageType=JPEG&amp;quot;,&amp;quot;tls&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;persist&amp;quot;:false,&amp;quot;proxy&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;authType&amp;quot;:&amp;quot;digest&amp;quot;,&amp;quot;x&amp;quot;:750,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;ff3c4b90.e504a8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ff3c4b90.e504a8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.chat.id&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;9999999&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;null&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;8888888&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:3,&amp;quot;x&amp;quot;:910,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;3edab718.b8c668&amp;quot;],[&amp;quot;3edab718.b8c668&amp;quot;,&amp;quot;4295b732.a42978&amp;quot;],[&amp;quot;4295b732.a42978&amp;quot;]],&amp;quot;outputLabels&amp;quot;:[&amp;quot;Sergey&amp;quot;,&amp;quot;Empty&amp;quot;,null]},{&amp;quot;id&amp;quot;:&amp;quot;3edab718.b8c668&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Chat ID&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;chatId&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;99999999&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:1060,&amp;quot;y&amp;quot;:120,&amp;quot;wires&amp;quot;:[[&amp;quot;d0a52ed6.209b5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d0a52ed6.209b5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Data&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;context.global.keyboard = { messageId : msg.payload.messageId };\n\nvar opts = {\n  reply_to_message_id: msg.payload.messageId,\n  reply_markup: JSON.stringify({\n    \&amp;quot;inline_keyboard\&amp;quot;: [[\n                {\n                    \&amp;quot;text\&amp;quot;: \&amp;quot;📷 Eщё снимок\&amp;quot;,\n                    \&amp;quot;callback_data\&amp;quot;: \&amp;quot;RING MORE PIC\&amp;quot;\n                }]\n            ]\n  })\n};\n\nmsg.payload = {\n    chatId: msg.chatId,\n    type: \&amp;quot;photo\&amp;quot;,\n    content: msg.payload,\n    caption: \&amp;quot;🔔 Звонок в дверь\&amp;quot;,\n    options: opts\n};\nreturn msg;\n&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:1210,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;9a15c39c.d532&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9a15c39c.d532&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;telegram sender&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bot&amp;quot;:&amp;quot;f6e2842.9c49078&amp;quot;,&amp;quot;haserroroutput&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:1390,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;4295b732.a42978&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Chat ID&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;chatId&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;8888888&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:1060,&amp;quot;y&amp;quot;:160,&amp;quot;wires&amp;quot;:[[&amp;quot;d0a52ed6.209b5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;eed3b3a.5d4555&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-current-state&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;TV Livingroom&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:2,&amp;quot;outputs&amp;quot;:2,&amp;quot;halt_if&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;entity_id&amp;quot;:&amp;quot;binary_sensor.livingroom_tv_state&amp;quot;,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;blockInputOverrides&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entity&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;triggerId&amp;quot;}],&amp;quot;x&amp;quot;:300,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;9dfd6ea5.6255&amp;quot;],[&amp;quot;631679c3.141578&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9dfd6ea5.6255&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;TV status&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;livingroom_tv_status&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:480,&amp;quot;y&amp;quot;:280,&amp;quot;wires&amp;quot;:[[&amp;quot;56da301b.3477a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;631679c3.141578&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;TV status&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;livingroom_tv_status&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;off&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:480,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;56da301b.3477a&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;56da301b.3477a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-current-state&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi Livingroom&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:2,&amp;quot;outputs&amp;quot;:2,&amp;quot;halt_if&amp;quot;:&amp;quot;playing&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;entity_id&amp;quot;:&amp;quot;media_player.kodi_livingroom&amp;quot;,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;blockInputOverrides&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entity&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;triggerId&amp;quot;}],&amp;quot;x&amp;quot;:300,&amp;quot;y&amp;quot;:380,&amp;quot;wires&amp;quot;:[[&amp;quot;3078c290.948d9e&amp;quot;],[&amp;quot;3e2fb6b7.4a64ea&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3078c290.948d9e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi status&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;livingroom_kodi_status&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;playing&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:490,&amp;quot;y&amp;quot;:360,&amp;quot;wires&amp;quot;:[[&amp;quot;b8cd7ae8.3af688&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;3e2fb6b7.4a64ea&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi status&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;livingroom_kodi_status&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;msg&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:490,&amp;quot;y&amp;quot;:400,&amp;quot;wires&amp;quot;:[[&amp;quot;b8cd7ae8.3af688&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b8cd7ae8.3af688&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-current-state&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Cast Livingroom&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:2,&amp;quot;outputs&amp;quot;:2,&amp;quot;halt_if&amp;quot;:&amp;quot;playing&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;entity_id&amp;quot;:&amp;quot;media_player.cast_livingroom&amp;quot;,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;blockInputOverrides&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entity&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;triggerId&amp;quot;}],&amp;quot;x&amp;quot;:300,&amp;quot;y&amp;quot;:460,&amp;quot;wires&amp;quot;:[[&amp;quot;198da4af.354efb&amp;quot;],[&amp;quot;872594d2.187c58&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;198da4af.354efb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Cast status&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;livingroom_cast_status&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;playing&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:490,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;44b931b4.dde44&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;872594d2.187c58&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Cast status&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;livingroom_cast_status&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;msg&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:490,&amp;quot;y&amp;quot;:480,&amp;quot;wires&amp;quot;:[[&amp;quot;44b931b4.dde44&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;44b931b4.dde44&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;if (msg.livingroom_tv_status == \&amp;quot;on\&amp;quot;) {\n    msg.kodi_service = \&amp;quot;kodi_livingroom_notifier\&amp;quot;\n    msg.kodi_name = \&amp;quot;media_player.kodi_livingroom\&amp;quot;\n    msg.tv_source = \&amp;quot;switch.livingroom_tv_kodi\&amp;quot;\n    if ((msg.livingroom_kodi_status == \&amp;quot;playing\&amp;quot;) &amp;amp;&amp;amp; (msg.livingroom_cast_status != \&amp;quot;playing\&amp;quot;)) {\n        return [msg, null]\n    } else if ((msg.livingroom_kodi_status != \&amp;quot;playing\&amp;quot;) &amp;amp;&amp;amp; (msg.livingroom_cast_status != \&amp;quot;playing\&amp;quot;)) {\n        return [null, msg]\n    }\n}&amp;quot;,&amp;quot;outputs&amp;quot;:2,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:380,&amp;quot;wires&amp;quot;:[[&amp;quot;f978d275.ceb4c&amp;quot;,&amp;quot;c0f778fa.ac9448&amp;quot;,&amp;quot;177f145e.c9c52c&amp;quot;,&amp;quot;b3b9bba.5bfe148&amp;quot;],[&amp;quot;b9933d4b.f5e5d&amp;quot;,&amp;quot;177f145e.c9c52c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;f978d275.ceb4c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ding&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    service: msg.kodi_service,\n    data: {\n        \&amp;quot;title\&amp;quot;: \&amp;quot;Звонок в дверь\&amp;quot;,\n        \&amp;quot;message\&amp;quot;: \&amp;quot;Звонок в дверь\&amp;quot;,\n        \&amp;quot;data\&amp;quot;: {\n            \&amp;quot;displaytime\&amp;quot;: 10000,\n            \&amp;quot;icon\&amp;quot;: \&amp;quot;http://172.16.1.3:8123/local/images/kodi_ding.png\&amp;quot;\n        }\n    }\n}\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:910,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;1b038a66.796fc6&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;c0f778fa.ac9448&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Fullscreen&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    data: {\n        \&amp;quot;entity_id\&amp;quot;: msg.kodi_name,\n        \&amp;quot;method\&amp;quot;: \&amp;quot;Addons.ExecuteAddon\&amp;quot;,\n        \&amp;quot;addonid\&amp;quot;: \&amp;quot;plugin.video.surveillanceroom\&amp;quot;,\n        \&amp;quot;params\&amp;quot;: \&amp;quot;action=single_camera_no_controls&amp;amp;camera_number=2\&amp;quot;\n    }\n}\n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:930,&amp;quot;y&amp;quot;:420,&amp;quot;wires&amp;quot;:[[&amp;quot;984d1a26.905238&amp;quot;,&amp;quot;1fb046db.e41fe9&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;177f145e.c9c52c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Preview&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    data: {\n        \&amp;quot;entity_id\&amp;quot;: msg.kodi_name,\n        \&amp;quot;method\&amp;quot;: \&amp;quot;Addons.ExecuteAddon\&amp;quot;,\n        \&amp;quot;addonid\&amp;quot;: \&amp;quot;plugin.video.surveillanceroom\&amp;quot;,\n        \&amp;quot;params\&amp;quot;: \&amp;quot;action=show_preview&amp;amp;camera_number=2\&amp;quot;\n    }\n}\n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:920,&amp;quot;y&amp;quot;:380,&amp;quot;wires&amp;quot;:[[&amp;quot;984d1a26.905238&amp;quot;,&amp;quot;ac428d66.c98c8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b3b9bba.5bfe148&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi name&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    data: {\n        \&amp;quot;entity_id\&amp;quot;: msg.kodi_name\n    }\n}\n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:930,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;7c68d79f.b82308&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b9933d4b.f5e5d&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Source&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = \n{\n    data: {\n        \&amp;quot;entity_id\&amp;quot;: msg.tv_source,\n    }\n}\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:920,&amp;quot;y&amp;quot;:460,&amp;quot;wires&amp;quot;:[[&amp;quot;905a9a46.5470f8&amp;quot;,&amp;quot;856436ab.16a478&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;905a9a46.5470f8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:false,&amp;quot;x&amp;quot;:740,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;f978d275.ceb4c&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;1b038a66.796fc6&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi notify&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;notify&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:1130,&amp;quot;y&amp;quot;:280,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;984d1a26.905238&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi call&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;kodi&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;call_method&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:1120,&amp;quot;y&amp;quot;:400,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;1fb046db.e41fe9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;32&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:false,&amp;quot;x&amp;quot;:1120,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;df077307.48a3b&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ac428d66.c98c8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;36&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:false,&amp;quot;x&amp;quot;:1120,&amp;quot;y&amp;quot;:360,&amp;quot;wires&amp;quot;:[[&amp;quot;d9f0be42.1e56e&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7c68d79f.b82308&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Media pause&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;media_player&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;media_play_pause&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:1130,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;b83a0255.369fe&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;856436ab.16a478&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Set TV source&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;turn_on&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:1140,&amp;quot;y&amp;quot;:480,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;d9f0be42.1e56e&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Back&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    data: {\n        \&amp;quot;entity_id\&amp;quot;: msg.kodi_name,\n        \&amp;quot;method\&amp;quot;: \&amp;quot;Input.Back\&amp;quot;\n    }\n}\n\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:1250,&amp;quot;y&amp;quot;:360,&amp;quot;wires&amp;quot;:[[&amp;quot;984d1a26.905238&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;df077307.48a3b&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Name&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    entity_id: msg.kodi_name\n}\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:1310,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[&amp;quot;7d3a4f11.178c3&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b83a0255.369fe&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;minutes&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:false,&amp;quot;x&amp;quot;:1280,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;67d3df46.400d5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7d3a4f11.178c3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Camera stop&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;media_player&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;media_stop&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:1470,&amp;quot;y&amp;quot;:440,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;67d3df46.400d5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Media play&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;media_player&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;media_play&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:1430,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[]]}]&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;PimW&quot;&gt;Использованные в сценарии модули Node-RED:&lt;br /&gt;&lt;strong&gt;node-red-contrib-stoptimer&lt;br /&gt;node-red-contrib-telegrambot&lt;br /&gt;node-red-contrib-interval&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Kzk5&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;EqyS&quot;&gt;Дальше этот сценарий можно расширять в зависимости от потребностей и насколько хватит воображения.&lt;/p&gt;
  &lt;figure id=&quot;LJAo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8f/ff/8fff72a7-d949-47b6-9e02-86175e1a9624.png&quot; width=&quot;1549&quot; /&gt;
    &lt;figcaption&gt;Итоговый Node-RED flow&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fJsU&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;blockquote id=&quot;QeNF&quot;&gt;Все конфигурации, описанные в статье, доступны на &lt;a href=&quot;https://github.com/isaenkovpro/configs/tree/master/002%20Kodi%20camera%20preview&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/blockquote&gt;

</content></entry><entry><id>isaenkov.pro:doorbell</id><link rel="alternate" type="text/html" href="https://isaenkov.pro/doorbell?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=isaenkov.pro"></link><title>Как сделать обычный дверной звонок умным</title><published>2021-07-15T18:59:47.856Z</published><updated>2024-10-22T08:51:16.322Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/7c/f8/7cf86673-fc2a-4297-bc95-1158abc85013.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/02/13/0213b370-9aea-459f-8896-47493a10e3b9.png&quot;&gt;Сегодня я расскажу о том, как автоматизировать обычный дверной звонок, чтобы он умел работать по расписанию, в беззвучном режиме, а также слать ведомления на смартфон при нажатии на кнопку. В этом мне поможет система домашней автоматизации на базе Home Assistant.</summary><content type="html">
  &lt;figure id=&quot;4Z6v&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/13/0213b370-9aea-459f-8896-47493a10e3b9.png&quot; width=&quot;1919&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;i71T&quot;&gt;Сегодня я расскажу о том, как автоматизировать обычный дверной звонок, чтобы он умел работать по расписанию, в беззвучном режиме, а также слать уведомления на смартфон при нажатии на кнопку. В этом мне поможет система домашней автоматизации на базе Home Assistant.&lt;/p&gt;
  &lt;p id=&quot;6gv9&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;PnLp&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/voNgwWWmwW8?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pP1N&quot;&gt;Однажды возникла необходимость выключать звук дверного звонка, чтобы случайные посетители перестали меня беспокоить, особенно в ночное время. &lt;/p&gt;
  &lt;p id=&quot;Y9jl&quot;&gt;Я начал с того, что определил схему подвода питания к звонку. Фаза уже присутствовала на нём, вместо того, чтобы подаваться на него в момент нажатия кнопки. В дальнейшем это сыграет свою роль.&lt;/p&gt;
  &lt;p id=&quot;B823&quot;&gt;Для реализации задуманного функционала я добавил в цепь реле. Это двухканальный релейный модуль от компании Fibaro. Работает по протоколу Z-Wave. Почему именно он, станет понятно чуть позже.&lt;/p&gt;
  &lt;figure id=&quot;pHFn&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e7/cf/e7cf70cc-b5ba-4be2-ad62-6ae17fc3db4a.png&quot; width=&quot;241&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Cr6i&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;soWY&quot;&gt;Хотя, конкретно в этом месте можно использовать любое другое устройство, будь то Fibaro, Sonoff или простой релейный модуль для Arduino.&lt;/p&gt;
  &lt;figure id=&quot;YMHY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/79/1f/791fe689-bb4b-4680-9843-43b458cb91a3.png&quot; width=&quot;726&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;mKKr&quot;&gt;&lt;/h3&gt;
  &lt;h3 id=&quot;UsMU&quot;&gt;Схема подключения&lt;/h3&gt;
  &lt;p id=&quot;NEwj&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Jf46&quot;&gt;Фаза подаётся на вход реле, а из первого выхода она идёт на звонок. Нулевой провод остаётся нетронутым.&lt;/p&gt;
  &lt;figure id=&quot;KsD6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d1/b7/d1b7df13-8aab-432b-8c28-f7386f6e2250.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nAWc&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;tQ2q&quot;&gt;В случае, если звонок подключен так, что кнопка разрывает фазу, а не ноль,&lt;br /&gt;то схема подключения будет такой — кнопка не будет работать, пока выключен выход реле O1:&lt;/p&gt;
  &lt;figure id=&quot;0JzV&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dd/1e/dd1ebb3e-2739-496f-b2ed-ff2ce850ab58.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;etEj&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;OtQf&quot;&gt;Либо такой, где фаза при нажатии кнопки подается на вход реле, а звонок звенит, только, если выход О1 включен:&lt;/p&gt;
  &lt;figure id=&quot;a7Ot&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/83/08/83088414-c950-4782-b899-38d7429010ad.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;U9VG&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;KcJV&quot;&gt;Программная часть&lt;/h3&gt;
  &lt;p id=&quot;lcJU&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;yBrV&quot; class=&quot;m_custom&quot;&gt;
      &lt;img src=&quot;https://img1.teletype.in/files/4e/ed/4eede09b-7ca7-4a29-b9cb-e52bc8383b24.png&quot; width=&quot;100&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;sSa1&quot;&gt;Я использую Home Assistant. Это довольно молодая, активно развивающаяся, очень мощная и гибкая система домашней автоматизации. Поддерживается огромным мировым сообществом энтузиастов, которые занимаются разработкой как самой платформы, так и компонентов, расширяющих ее функционал для работы со множеством устройств, платформ и сервисов.&lt;/p&gt;
  &lt;p id=&quot;DdzG&quot;&gt;Home Assistant у меня работает на Raspberry Pi 3 в Docker-контейнере. Поставляется в виде готового решения под названием Hass.io.&lt;/p&gt;
  &lt;p id=&quot;7bUm&quot;&gt;Также к Raspberry Pi у меня подключен Z-Wave-контроллер в виде платы расширения.&lt;/p&gt;
  &lt;figure id=&quot;m4Vz&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/18/0e/180ec684-0a14-4d53-9fac-cc8f1f0fa92d.jpeg&quot; width=&quot;335&quot; /&gt;
    &lt;figcaption&gt;RaZberry&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;XHnl&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;G4lH&quot;&gt;После подключения модуля к сети и добавления его в Home Assistant, для удобства, я переименую Z-Wave-ноду и поменяю имя и ID объекта непосредственно у реле.&lt;/p&gt;
  &lt;figure id=&quot;77TF&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3a/c6/3ac6dd59-6a24-42dc-b6ed-714b4aac2933.png&quot; width=&quot;530&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;wVOF&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b2/b6/b2b61f56-d5d2-487c-9542-bc7ecbf0f790.png&quot; width=&quot;504&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;IzMz&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ihLV&quot;&gt;После добавления устройства в конфигурационный файл, оно появляется в интерфейсе. Этот переключатель позволяет управлять звонком в ручном режиме.&lt;/p&gt;
  &lt;figure id=&quot;8VPh&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/4a/f44a5a45-e400-4ee4-a1e8-724159cf3498.png&quot; width=&quot;512&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;oCdi&quot;&gt;Для работы по расписанию я покажу пример, допустим, чтобы звонок не реагировал на нажатие кнопки с 10 вечера до 9 утра.&lt;/p&gt;
  &lt;p id=&quot;zbrk&quot;&gt;В этом мне поможет Node-Red.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;2ppZ&quot; class=&quot;m_custom&quot;&gt;
      &lt;img src=&quot;https://img4.teletype.in/files/32/f2/32f21047-5765-4abc-8941-fd7abecc732b.png&quot; width=&quot;100&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;EIci&quot;&gt;Node-RED — это open-source инструмент, который служит для связи железа и сервисов. Здесь используются графические линий связи, по которым пересылаются сообщения между узлами. Таким образом различные блоки связываются просто мышкой без использования программирования. Вся разработка в Node-RED ведется через браузер, а ядро можно запустить на различных платформах.&lt;/p&gt;
  &lt;p id=&quot;QjvV&quot;&gt;У меня оно также работает в Docker-контейнере в виде плагина для Hass.io.&lt;/p&gt;
  &lt;p id=&quot;u7WO&quot;&gt;Я добавил interval node, которая раз в минуту будет дёргать следующую ноду с настройкой периода времени, где я указал желаемый диапазон.&lt;/p&gt;
  &lt;figure id=&quot;gpdC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f9/a2/f9a2e449-3c7d-47de-b841-80e79a344c6c.png&quot; width=&quot;726&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SlRy&quot;&gt;Если текущий момент времени попадает в заданный мною интервал, то звонок выключится после проверки его состояния.&lt;/p&gt;
  &lt;p id=&quot;1lmx&quot;&gt;Если он уже был выключен ранее, то команда не пойдет дальше. Аналогично и со вторым выходом.&lt;/p&gt;
  &lt;p id=&quot;yIWm&quot;&gt;Если текущее время не попадает в интервал, то проверяем статус, и включаем звонок, если этого не было сделано ранее.&lt;/p&gt;
  &lt;p id=&quot;Xzsg&quot;&gt;Код этого Node-RED-flow представлен ниже:&lt;/p&gt;
  &lt;pre data-lang=&quot;jsx&quot; id=&quot;zVfG&quot;&gt;[{&amp;quot;id&amp;quot;:&amp;quot;e0f64da0.c0817&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;interval&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interval&amp;quot;,&amp;quot;interval&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;onstart&amp;quot;:true,&amp;quot;msg&amp;quot;:&amp;quot;ping&amp;quot;,&amp;quot;showstatus&amp;quot;:false,&amp;quot;unit&amp;quot;:&amp;quot;minutes&amp;quot;,&amp;quot;statusformat&amp;quot;:&amp;quot;YYYY-MM-D HH:mm:ss&amp;quot;,&amp;quot;x&amp;quot;:110,&amp;quot;y&amp;quot;:160,&amp;quot;wires&amp;quot;:[[&amp;quot;b43c9154.0a918&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;b43c9154.0a918&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;time-range-switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Sleeptime&amp;quot;,&amp;quot;lat&amp;quot;:&amp;quot;55.00&amp;quot;,&amp;quot;lon&amp;quot;:&amp;quot;37.00&amp;quot;,&amp;quot;startTime&amp;quot;:&amp;quot;22:00&amp;quot;,&amp;quot;endTime&amp;quot;:&amp;quot;09:00&amp;quot;,&amp;quot;startOffset&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;endOffset&amp;quot;:0,&amp;quot;x&amp;quot;:260,&amp;quot;y&amp;quot;:160,&amp;quot;wires&amp;quot;:[[&amp;quot;70939410.71bf1c&amp;quot;],[&amp;quot;a71468e9.d47168&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;70939410.71bf1c&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-current-state&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Статус звонка&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:2,&amp;quot;outputs&amp;quot;:2,&amp;quot;halt_if&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;entity_id&amp;quot;:&amp;quot;switch.corridor_doorbell&amp;quot;,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;blockInputOverrides&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entity&amp;quot;}],&amp;quot;override_topic&amp;quot;:false,&amp;quot;state_location&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;override_payload&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;entity_location&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;override_data&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:460,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[&amp;quot;f28e5d04.a653b&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;f28e5d04.a653b&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Дверной звонок&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;turn_off&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;switch.corridor_doorbell&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;jsonata&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:680,&amp;quot;y&amp;quot;:140,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;a71468e9.d47168&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-current-state&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Статус звонка&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:2,&amp;quot;outputs&amp;quot;:2,&amp;quot;halt_if&amp;quot;:&amp;quot;off&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;entity_id&amp;quot;:&amp;quot;switch.corridor_doorbell&amp;quot;,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;blockInputOverrides&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entity&amp;quot;}],&amp;quot;override_topic&amp;quot;:false,&amp;quot;state_location&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;override_payload&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;entity_location&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;override_data&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;x&amp;quot;:460,&amp;quot;y&amp;quot;:180,&amp;quot;wires&amp;quot;:[[&amp;quot;9796db3.788e328&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;9796db3.788e328&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Дверной звонок&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;turn_on&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;switch.corridor_doorbell&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;jsonata&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:680,&amp;quot;y&amp;quot;:180,&amp;quot;wires&amp;quot;:[[]]}]}]&lt;/pre&gt;
  &lt;p id=&quot;TrEc&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Hb4r&quot;&gt;Уведомление в Telegram&lt;/h3&gt;
  &lt;p id=&quot;Ewg9&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;59cO&quot;&gt;Как раз для этого идеально подходит релейный модуль от Fibaro, т.к. он имеет возможность управления выходами с помощью подключенных выключателей&lt;br /&gt;или кнопок к клеммам S1 и S2.&lt;/p&gt;
  &lt;figure id=&quot;ndP3&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a6/23/a6232763-7529-426e-848b-c2d9f5a12207.png&quot; width=&quot;388&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gaeS&quot;&gt;При подаче фазы на один из этих входов срабатывает соответствующий ему выход реле O1 или O2. Так как у меня выход O1 уже занят самим звонком, то я задействую вход S2.&lt;/p&gt;
  &lt;p id=&quot;64xO&quot;&gt;Из-за того, что в моём случае схема такова, что кнопкой разрывается ноль, а на вход S2 нужно подать фазу, то задача усложняется. Потребуется дополнительный элемент в виде твердотельного реле, управляемого переменным током.&lt;/p&gt;
  &lt;figure id=&quot;sJqC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d3/f9/d3f9883e-6b23-4bf1-a20a-dbb800e0777e.png&quot; width=&quot;761&quot; /&gt;
    &lt;figcaption&gt;Реле SSR-40 DA&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DsTD&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Q7Z0&quot;&gt;К одному из входов для обеспечения работы этого реле подключается фаза. Эта же фаза подключается и к одному из выходов, для дальнейшей её передачи на модуль в качестве управляющего сигнала. Ноль для питания реле берём от звонка.&lt;/p&gt;
  &lt;figure id=&quot;Bg2J&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ca/b2/cab2407d-a4fc-41c3-bc20-09cd1022aae3.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pKyP&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;druZ&quot;&gt;Таким образом, при нажатии на кнопку, реле включается, его выход закрывается,&lt;br /&gt;и управляющий сигнал попадает на вход S2 модуля Fibaro.&lt;/p&gt;
  &lt;figure id=&quot;qSna&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bc/0a/bc0a0963-8d84-485c-830d-9c15780b0ce0.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;H6X0&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;4Ipy&quot;&gt;Опять же, в случае, где кнопкой разрывается фаза, всё гораздо проще, и надо всего лишь соединить между собой общий вход реле и вход S2.&lt;/p&gt;
  &lt;figure id=&quot;dE0i&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/12/aa/12aadcaf-5e68-4abd-ba27-de848abfe5eb.png&quot; width=&quot;761&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vRmQ&quot;&gt;Итак, с железной частью разобрались. Перейдем к настройке.&lt;/p&gt;
  &lt;p id=&quot;jIrx&quot;&gt;В свойствах релейного модуля (конфигурация Z-Wave) необходимо обязательно задать два параметра. Первый отвечает за то, что при нажатой кнопке реле включено, а при отпущенной выключено.&lt;/p&gt;
  &lt;figure id=&quot;bWIa&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/df/c3/dfc3a82c-324c-4c71-8c90-6d707892bd3a.png&quot; width=&quot;624&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Kr0w&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;2TD9&quot;&gt;А второй то, что кнопка является двухпозиционным выключателем. Иначе схема не будет работать.&lt;/p&gt;
  &lt;figure id=&quot;tXui&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c3/a2/c3a26158-ecd0-49ef-8d82-d64178aeeb3a.png&quot; width=&quot;609&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ePYV&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ox8W&quot;&gt;Аналогично меняю имя и ID у переключателя, который соответствует второму реле модуля Fibaro,&lt;/p&gt;
  &lt;figure id=&quot;P3NR&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0e/03/0e03e022-1b01-4cbc-862d-5e5a042956dd.png&quot; width=&quot;407&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Owi1&quot;&gt;и перехожу к созданию сценария для получения уведомления.&lt;/p&gt;
  &lt;figure id=&quot;5j5u&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1a/fe/1afecfa6-afc6-42e0-b9b9-f87c58e3b534.png&quot; width=&quot;698&quot; /&gt;
    &lt;figcaption&gt;Итоговый вид сценария претерпел изменения. Код обновлённого flow доступен ниже.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;zgwT&quot;&gt;
    &lt;li id=&quot;yHq2&quot;&gt;Добавляем ноду и указываем в ней ID устройства, срабатывающего при нажатии кнопки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;9dhh&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/47/0a/470a19dc-88a7-4e10-a8f9-74ae25c64f12.png&quot; width=&quot;502&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;cvAZ&quot;&gt;
    &lt;li id=&quot;ETpi&quot;&gt;Далее включаем ограничение получения сообщений не чаще одного раза в 2 минуты, чтобы не плодить уведомления при многократном нажатии кнопки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Yx9A&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/32/a6/32a65eb2-0342-46e5-bb9f-a1c7bbd31244.png&quot; width=&quot;509&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;7EkE&quot;&gt;
    &lt;li id=&quot;N9F1&quot;&gt;И непосредственно отправка.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Sklf&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f3/d9/f3d90a44-e6c2-4612-afe4-c33b6b685771.png&quot; width=&quot;556&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;birA&quot;&gt;Для взаимодействия с telegram-ботом необходимо установить модуль&lt;br /&gt;&lt;strong&gt;node-red-contrib-telegrambot&lt;/strong&gt; для Node-RED.&lt;/p&gt;
  &lt;ul id=&quot;3nKK&quot;&gt;
    &lt;li id=&quot;K9Vd&quot;&gt;Выбираем своего настроенного бота, в параметрах которого заполняется имя, токен, полученный при создании бота, и разрешенные для общения с ним Chat ID через запятую.&lt;/li&gt;
    &lt;li id=&quot;gY6U&quot;&gt;Указываем свой Chat ID для получения сообщений от бота и произвольный текст уведомления в виде шаблона, взятого из документации к ноде, работа методов которой, в свою очередь, основана на документации Telegram Bot API.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;W1mk&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;5jrV&quot;&gt;Снимок с камеры при звонке&lt;/h3&gt;
  &lt;p id=&quot;ZMe0&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;W3wB&quot;&gt;Как видно, сообщение почти сразу приходит после нажатия кнопки.&lt;/p&gt;
  &lt;figure id=&quot;Kmwf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7e/c3/7ec36866-d03c-46d2-b32b-6a715e6d3693.png&quot; width=&quot;877&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;A5n2&quot;&gt;Как и задумано, повторное нажатие кнопки ничего не даёт.&lt;/p&gt;
  &lt;p id=&quot;gPHg&quot;&gt;Дальше мне захотелось видеть звонящего. Я остановил свой выбор на аналоговой камере в виде дверного глазка.&lt;/p&gt;
  &lt;figure id=&quot;Vhot&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f7/9e/f79ecd1f-e719-41ac-bd02-8cbc11504dc6.jpeg&quot; width=&quot;418&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;K0IH&quot;&gt;Единственным её плюсом является возможность установки в дверь на уровне глаз. Потому как низкая стоимость камеры нивелируется необходимостью покупки видеорегистратора для получения цифрового сигнала.&lt;/p&gt;
  &lt;figure id=&quot;bypN&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b9/c9/b9c9df79-ed5c-48a9-b545-f2fc54df6723.jpeg&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tlb2&quot;&gt;Для получения снимка с камеры в уведомлении изменим сценарий, добавив ноду&lt;br /&gt;HTTP request.&lt;/p&gt;
  &lt;figure id=&quot;gsvk&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ec/3b/ec3ba2a2-a18c-4b2c-a377-cc95e984c762.png&quot; width=&quot;1285&quot; /&gt;
    &lt;figcaption&gt;Итоговый вид сценария претерпел изменения. Код обновлённого flow доступен ниже.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KwMk&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;h0wf&quot;&gt;В ней указываем адрес, который отдаёт статическое изображение (его можно взять из документации к камере или видеорегистратору).&lt;/p&gt;
  &lt;figure id=&quot;HzTc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6a/0f/6a0f3861-f1dd-4830-babd-b6fb062a15fa.png&quot; width=&quot;503&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zomT&quot;&gt;Я заранее подключил камеру к Home Assistant, поэтому ссылка ведет к нему.&lt;br /&gt;В качестве результата запроса выбираем ”a binary buffer”.&lt;/p&gt;
  &lt;p id=&quot;jI4n&quot;&gt;Следом добавляем ноду function, где формируем содержимое согласно документации telegram-ноды по отправке изображений. Содержимым снимка будет полученный ранее ответ от ноды HTTP request.&lt;/p&gt;
  &lt;p id=&quot;uxs2&quot;&gt;Далее добавляем telegram-ноду payload. В ней указываем Chat ID и метод отправки. Предполагается, что бог уже заранее настроен.&lt;/p&gt;
  &lt;p id=&quot;lRGn&quot;&gt;Последней я решил добавить telegram-ноду для отображения кнопки получения дополнительного снимка на случай неудачного первого кадра.&lt;/p&gt;
  &lt;p id=&quot;xlpF&quot;&gt;Код этого Node-RED flow представлен ниже:&lt;/p&gt;
  &lt;pre id=&quot;spod&quot;&gt;[{&amp;quot;id&amp;quot;:&amp;quot;9f016b89.edeb18&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;server-state-changed&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Звонок в дверь&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;exposeToHomeAssistant&amp;quot;:false,&amp;quot;haConfig&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;icon&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;}],&amp;quot;entityidfilter&amp;quot;:&amp;quot;switch.corridor_doorbell_ding&amp;quot;,&amp;quot;entityidfiltertype&amp;quot;:&amp;quot;substring&amp;quot;,&amp;quot;outputinitially&amp;quot;:false,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;haltifstate&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;outputs&amp;quot;:2,&amp;quot;output_only_on_state_change&amp;quot;:false,&amp;quot;for&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;forType&amp;quot;:&amp;quot;num&amp;quot;,&amp;quot;forUnits&amp;quot;:&amp;quot;minutes&amp;quot;,&amp;quot;ignorePrevStateNull&amp;quot;:false,&amp;quot;ignorePrevStateUnknown&amp;quot;:false,&amp;quot;ignorePrevStateUnavailable&amp;quot;:false,&amp;quot;ignoreCurrentStateUnknown&amp;quot;:false,&amp;quot;ignoreCurrentStateUnavailable&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;eventData&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;triggerId&amp;quot;}],&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;96fbc9f0.88a2e8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;96fbc9f0.88a2e8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;rate&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;120&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:true,&amp;quot;x&amp;quot;:360,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;65c28ed9.0a8e6&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;65c28ed9.0a8e6&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;stoptimer&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;duration&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;units&amp;quot;:&amp;quot;Second&amp;quot;,&amp;quot;payloadtype&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;payloadval&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Timeout&amp;quot;,&amp;quot;x&amp;quot;:600,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;4a1d76bc.4213b8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;6a886333.f832cc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;telegram event&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Еще снимок&amp;quot;,&amp;quot;bot&amp;quot;:&amp;quot;f6e2842.9c49078&amp;quot;,&amp;quot;event&amp;quot;:&amp;quot;callback_query&amp;quot;,&amp;quot;autoanswer&amp;quot;:true,&amp;quot;x&amp;quot;:510,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;7d5306e4.b68658&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7d5306e4.b68658&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.content&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;RING MORE PIC&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:635,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;4a1d76bc.4213b8&amp;quot;]],&amp;quot;l&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;4a1d76bc.4213b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;http request&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;GET&amp;quot;,&amp;quot;ret&amp;quot;:&amp;quot;bin&amp;quot;,&amp;quot;paytoqs&amp;quot;:&amp;quot;ignore&amp;quot;,&amp;quot;url&amp;quot;:&amp;quot;http://192.168.1.51/ISAPI/Streaming/channels/101/picture?snapShotImageType=JPEG&amp;quot;,&amp;quot;tls&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;persist&amp;quot;:false,&amp;quot;proxy&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;authType&amp;quot;:&amp;quot;digest&amp;quot;,&amp;quot;x&amp;quot;:790,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;ff3c4b90.e504a8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ff3c4b90.e504a8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.chat.id&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;9999999&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;null&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;8888888&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:3,&amp;quot;x&amp;quot;:950,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;3edab718.b8c668&amp;quot;],[&amp;quot;3edab718.b8c668&amp;quot;,&amp;quot;4295b732.a42978&amp;quot;],[&amp;quot;4295b732.a42978&amp;quot;]],&amp;quot;outputLabels&amp;quot;:[&amp;quot;Sergey&amp;quot;,&amp;quot;Empty&amp;quot;,null]},{&amp;quot;id&amp;quot;:&amp;quot;3edab718.b8c668&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Chat ID&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;chatId&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;99999999&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:1100,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;d0a52ed6.209b5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d0a52ed6.209b5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Data&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;context.global.keyboard = { messageId : msg.payload.messageId };\n\nvar opts = {\n  reply_to_message_id: msg.payload.messageId,\n  reply_markup: JSON.stringify({\n    \&amp;quot;inline_keyboard\&amp;quot;: [[\n                {\n                    \&amp;quot;text\&amp;quot;: \&amp;quot;📷 Eщё снимок\&amp;quot;,\n                    \&amp;quot;callback_data\&amp;quot;: \&amp;quot;RING MORE PIC\&amp;quot;\n                }]\n            ]\n  })\n};\n\nmsg.payload = {\n    chatId: msg.chatId,\n    type: \&amp;quot;photo\&amp;quot;,\n    content: msg.payload,\n    caption: \&amp;quot;🔔 Звонок в дверь\&amp;quot;,\n    options: opts\n};\nreturn msg;\n&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:1250,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;9a15c39c.d532&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9a15c39c.d532&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;telegram sender&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bot&amp;quot;:&amp;quot;f6e2842.9c49078&amp;quot;,&amp;quot;haserroroutput&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:1430,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;4295b732.a42978&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Chat ID&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;chatId&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;8888888&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:1100,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;d0a52ed6.209b5&amp;quot;]]}]&lt;/pre&gt;
  &lt;p id=&quot;eGMH&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;J2gM&quot;&gt;Результат&lt;/h3&gt;
  &lt;p id=&quot;O68y&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;lpk0&quot;&gt;Несмотря на подключение к сети через мобильного оператора, сообщение приходит в течение одной секунды.&lt;/p&gt;
  &lt;figure id=&quot;YRrQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e3/d8/e3d82803-234b-4d11-9f1e-370a689946d3.png&quot; width=&quot;1727&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fmL9&quot;&gt;А в Node-RED видно момент нажатия кнопки звонка, а также нажатия кнопки получения дополнительного снимка.&lt;/p&gt;
  &lt;p id=&quot;TZvL&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;pKJe&quot;&gt;Kodi&lt;/h3&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;JNVl&quot; class=&quot;m_custom&quot;&gt;
      &lt;img src=&quot;https://img1.teletype.in/files/85/b6/85b689c3-a5e9-47b0-acba-f0be3d6a1dd8.png&quot; width=&quot;100&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;iMut&quot;&gt;Позже я обратил внимание на один из компонентов Home Assistant, который умеет слать уведомления в медиацентр Kodi.&lt;/p&gt;
  &lt;p id=&quot;KxDQ&quot;&gt;Настроив его согласно &lt;a href=&quot;https://www.home-assistant.io/integrations/kodi/#notifications&quot; target=&quot;_blank&quot;&gt;документации&lt;/a&gt;, я отправился в Node-RED для обновления имеющегося сценария.&lt;/p&gt;
  &lt;figure id=&quot;dzsK&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c4/f5/c4f52458-4d52-42b6-aa40-b251a6341559.png&quot; width=&quot;1060&quot; /&gt;
    &lt;figcaption&gt;Итоговый вид сценария претерпел изменения. Код обновлённого flow доступен ниже.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8usu&quot;&gt;Первый делом добавил ноду call service (Kodi notify) из раздела Home Assistant.&lt;/p&gt;
  &lt;p id=&quot;KpZF&quot;&gt;В параметрах заполнил только поле домен, т. к. остальное легче сформировать в ноде function. Взяв &lt;a href=&quot;https://www.home-assistant.io/integrations/kodi/#script-example&quot; target=&quot;_blank&quot;&gt;этот пример скрипта&lt;/a&gt; за основу, я сконвертировал yaml в json и добавил в function-ноду. Затем поменял параметры по своему усмотрению.&lt;/p&gt;
  &lt;p id=&quot;O7Ja&quot;&gt;Код этого Node-RED flow представлен ниже:&lt;/p&gt;
  &lt;pre id=&quot;5imP&quot;&gt;[{&amp;quot;id&amp;quot;:&amp;quot;9f016b89.edeb18&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;server-state-changed&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Звонок в дверь&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;exposeToHomeAssistant&amp;quot;:false,&amp;quot;haConfig&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;icon&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;}],&amp;quot;entityidfilter&amp;quot;:&amp;quot;switch.corridor_doorbell_ding&amp;quot;,&amp;quot;entityidfiltertype&amp;quot;:&amp;quot;substring&amp;quot;,&amp;quot;outputinitially&amp;quot;:false,&amp;quot;state_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;haltifstate&amp;quot;:&amp;quot;on&amp;quot;,&amp;quot;halt_if_type&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;halt_if_compare&amp;quot;:&amp;quot;is&amp;quot;,&amp;quot;outputs&amp;quot;:2,&amp;quot;output_only_on_state_change&amp;quot;:false,&amp;quot;for&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;forType&amp;quot;:&amp;quot;num&amp;quot;,&amp;quot;forUnits&amp;quot;:&amp;quot;minutes&amp;quot;,&amp;quot;ignorePrevStateNull&amp;quot;:false,&amp;quot;ignorePrevStateUnknown&amp;quot;:false,&amp;quot;ignorePrevStateUnavailable&amp;quot;:false,&amp;quot;ignoreCurrentStateUnknown&amp;quot;:false,&amp;quot;ignoreCurrentStateUnavailable&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;entityState&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;eventData&amp;quot;},{&amp;quot;property&amp;quot;:&amp;quot;topic&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;triggerId&amp;quot;}],&amp;quot;x&amp;quot;:140,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;96fbc9f0.88a2e8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;96fbc9f0.88a2e8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;delay&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;pauseType&amp;quot;:&amp;quot;rate&amp;quot;,&amp;quot;timeout&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;timeoutUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;rate&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;nbRateUnits&amp;quot;:&amp;quot;120&amp;quot;,&amp;quot;rateUnits&amp;quot;:&amp;quot;second&amp;quot;,&amp;quot;randomFirst&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;randomLast&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;randomUnits&amp;quot;:&amp;quot;seconds&amp;quot;,&amp;quot;drop&amp;quot;:true,&amp;quot;x&amp;quot;:360,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;65c28ed9.0a8e6&amp;quot;,&amp;quot;2618bb1b.e9dff4&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;65c28ed9.0a8e6&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;stoptimer&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;duration&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;units&amp;quot;:&amp;quot;Second&amp;quot;,&amp;quot;payloadtype&amp;quot;:&amp;quot;str&amp;quot;,&amp;quot;payloadval&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Timeout&amp;quot;,&amp;quot;x&amp;quot;:600,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;4a1d76bc.4213b8&amp;quot;],[]]},{&amp;quot;id&amp;quot;:&amp;quot;6a886333.f832cc&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;telegram event&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Еще снимок&amp;quot;,&amp;quot;bot&amp;quot;:&amp;quot;f6e2842.9c49078&amp;quot;,&amp;quot;event&amp;quot;:&amp;quot;callback_query&amp;quot;,&amp;quot;autoanswer&amp;quot;:true,&amp;quot;x&amp;quot;:510,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;7d5306e4.b68658&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;7d5306e4.b68658&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.content&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;RING MORE PIC&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:635,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;4a1d76bc.4213b8&amp;quot;]],&amp;quot;l&amp;quot;:false},{&amp;quot;id&amp;quot;:&amp;quot;4a1d76bc.4213b8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;http request&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;GET&amp;quot;,&amp;quot;ret&amp;quot;:&amp;quot;bin&amp;quot;,&amp;quot;paytoqs&amp;quot;:&amp;quot;ignore&amp;quot;,&amp;quot;url&amp;quot;:&amp;quot;http://192.168.1.51/ISAPI/Streaming/channels/101/picture?snapShotImageType=JPEG&amp;quot;,&amp;quot;tls&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;persist&amp;quot;:false,&amp;quot;proxy&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;authType&amp;quot;:&amp;quot;digest&amp;quot;,&amp;quot;x&amp;quot;:790,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;ff3c4b90.e504a8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;ff3c4b90.e504a8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;switch&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;payload.chat.id&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;9999999&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;null&amp;quot;},{&amp;quot;t&amp;quot;:&amp;quot;eq&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;8888888&amp;quot;,&amp;quot;vt&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;checkall&amp;quot;:&amp;quot;true&amp;quot;,&amp;quot;repair&amp;quot;:false,&amp;quot;outputs&amp;quot;:3,&amp;quot;x&amp;quot;:950,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;3edab718.b8c668&amp;quot;],[&amp;quot;3edab718.b8c668&amp;quot;,&amp;quot;4295b732.a42978&amp;quot;],[&amp;quot;4295b732.a42978&amp;quot;]],&amp;quot;outputLabels&amp;quot;:[&amp;quot;Sergey&amp;quot;,&amp;quot;Empty&amp;quot;,null]},{&amp;quot;id&amp;quot;:&amp;quot;3edab718.b8c668&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Chat ID&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;chatId&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;99999999&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:1100,&amp;quot;y&amp;quot;:300,&amp;quot;wires&amp;quot;:[[&amp;quot;d0a52ed6.209b5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;d0a52ed6.209b5&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Data&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;context.global.keyboard = { messageId : msg.payload.messageId };\n\nvar opts = {\n  reply_to_message_id: msg.payload.messageId,\n  reply_markup: JSON.stringify({\n    \&amp;quot;inline_keyboard\&amp;quot;: [[\n                {\n                    \&amp;quot;text\&amp;quot;: \&amp;quot;📷 Eщё снимок\&amp;quot;,\n                    \&amp;quot;callback_data\&amp;quot;: \&amp;quot;RING MORE PIC\&amp;quot;\n                }]\n            ]\n  })\n};\n\nmsg.payload = {\n    chatId: msg.chatId,\n    type: \&amp;quot;photo\&amp;quot;,\n    content: msg.payload,\n    caption: \&amp;quot;🔔 Звонок в дверь\&amp;quot;,\n    options: opts\n};\nreturn msg;\n&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:1250,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[&amp;quot;9a15c39c.d532&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;9a15c39c.d532&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;telegram sender&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;bot&amp;quot;:&amp;quot;f6e2842.9c49078&amp;quot;,&amp;quot;haserroroutput&amp;quot;:false,&amp;quot;outputs&amp;quot;:1,&amp;quot;x&amp;quot;:1430,&amp;quot;y&amp;quot;:320,&amp;quot;wires&amp;quot;:[[]]},{&amp;quot;id&amp;quot;:&amp;quot;4295b732.a42978&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;change&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Chat ID&amp;quot;,&amp;quot;rules&amp;quot;:[{&amp;quot;t&amp;quot;:&amp;quot;set&amp;quot;,&amp;quot;p&amp;quot;:&amp;quot;chatId&amp;quot;,&amp;quot;pt&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;8888888&amp;quot;,&amp;quot;tot&amp;quot;:&amp;quot;str&amp;quot;}],&amp;quot;action&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;property&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;reg&amp;quot;:false,&amp;quot;x&amp;quot;:1100,&amp;quot;y&amp;quot;:340,&amp;quot;wires&amp;quot;:[[&amp;quot;d0a52ed6.209b5&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;2618bb1b.e9dff4&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ding&amp;quot;,&amp;quot;func&amp;quot;:&amp;quot;msg.payload = {\n    service: \&amp;quot;kodi_livingroom_notifier\&amp;quot;,\n    data: {\n        \&amp;quot;title\&amp;quot;: \&amp;quot;Звонок в дверь\&amp;quot;,\n        \&amp;quot;message\&amp;quot;: \&amp;quot;Звонок в дверь\&amp;quot;,\n        \&amp;quot;data\&amp;quot;: {\n            \&amp;quot;displaytime\&amp;quot;: 10000,\n            \&amp;quot;icon\&amp;quot;: \&amp;quot;http://172.16.1.3:8123/local/images/kodi_ding.png\&amp;quot;\n        }\n    }\n}\nreturn msg;&amp;quot;,&amp;quot;outputs&amp;quot;:1,&amp;quot;noerr&amp;quot;:0,&amp;quot;initialize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;finalize&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;libs&amp;quot;:[],&amp;quot;x&amp;quot;:550,&amp;quot;y&amp;quot;:420,&amp;quot;wires&amp;quot;:[[&amp;quot;caae558f.e8dac8&amp;quot;]]},{&amp;quot;id&amp;quot;:&amp;quot;caae558f.e8dac8&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;api-call-service&amp;quot;,&amp;quot;z&amp;quot;:&amp;quot;fd15b534.04ee48&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kodi notify&amp;quot;,&amp;quot;server&amp;quot;:&amp;quot;b9490f48.586ed&amp;quot;,&amp;quot;version&amp;quot;:3,&amp;quot;debugenabled&amp;quot;:false,&amp;quot;service_domain&amp;quot;:&amp;quot;notify&amp;quot;,&amp;quot;service&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;entityId&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;{}&amp;quot;,&amp;quot;dataType&amp;quot;:&amp;quot;json&amp;quot;,&amp;quot;mergecontext&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;mustacheAltTags&amp;quot;:false,&amp;quot;outputProperties&amp;quot;:[{&amp;quot;property&amp;quot;:&amp;quot;payload&amp;quot;,&amp;quot;propertyType&amp;quot;:&amp;quot;msg&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;valueType&amp;quot;:&amp;quot;data&amp;quot;}],&amp;quot;queue&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;x&amp;quot;:710,&amp;quot;y&amp;quot;:420,&amp;quot;wires&amp;quot;:[[]]}]&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Myia&quot;&gt;Использованные в сценарии модули Node-RED:&lt;br /&gt;&lt;strong&gt;node-red-contrib-time-range-switch&lt;br /&gt;node-red-contrib-stoptimer&lt;br /&gt;node-red-contrib-telegrambot&lt;br /&gt;node-red-contrib-interval&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;mxmH&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FObu&quot;&gt;На выходе я получил дополнительное уведомление для звонка, работающего в беззвучном режиме.&lt;/p&gt;
  &lt;figure id=&quot;SyaC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bf/70/bf70f803-c5c0-45cd-ac50-18b01026e3c6.png&quot; width=&quot;802&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;25Tw&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;QN7y&quot;&gt;Так как для использования в Kodi доступно огромное количество различных плагинов, то следом я настроил отображение видеопотока с камеры одновременно с уведомлением.&lt;/p&gt;
  &lt;figure id=&quot;XYvS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b7/e2/b7e27f16-d63c-45e4-8504-a7a853e4ba56.png&quot; width=&quot;1918&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pBVW&quot;&gt;Но это тема следующих статей, так как она достаточно объемная и затрагивает&lt;br /&gt;многие, еще неописанные, вещи.&lt;/p&gt;
  &lt;p id=&quot;Disq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;xUFg&quot;&gt;В заключение скажу, что, конечно, есть отличные готовые решения.&lt;/p&gt;
  &lt;figure id=&quot;Rk3b&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/35/f435f9cf-5ef9-42b1-8e2f-e7d8225ccf36.jpeg&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;ATAV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/26/5d/265ddaf9-3f29-4156-bfbc-f55e948e4bfd.png&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;TfEL&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bd/e9/bde9055b-df37-4e63-886f-6d3a2f3c158b.jpeg&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;17FS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/75/64/7564655d-b4ae-4972-9eb1-3987416224d0.jpeg&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2iyN&quot;&gt;В силу специфики своей работы или высокой стоимости они мне не подошли.&lt;/p&gt;
  &lt;p id=&quot;emEg&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;hmO8&quot;&gt;Все конфигурации, описанные в статье, доступны на &lt;a href=&quot;https://github.com/isaenkovpro/configs/tree/master/001%20Doorbell&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

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