Code Monkey home page Code Monkey logo

smartintercom's People

Contributors

scrators avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

smartintercom's Issues

Управление домофоном через Телеграм

Так как предыдущая версия автоматизации малость устарела, то новая - рабочая.

smartintercom

Создаем файл с именем "telegram_smartintercom.yaml" и в него записываем следующий ниже код.
В принципе файл может иметь и другое имя.
Если все автоматизации у вас в одном файле указанном в настройке "automation: !include automations.yaml", то самую первую строку кода "automation:" удалить.
Первая автоматизация "- id: 'telegram_smartintercom'" используется только если вам нужно вызвать меню домофона напрямую командой "/smartintercom". Если нет, то тоже можно удалить.
Вторая автоматизация "- id: 'telegram_smartintercom_callback'" используется, если вызов идет непосредственно из меню верхнего уровня.

Две строки меню в обеих автоматизациях:

  • '{{"\U000021A9"}} Назад:/hallway' - возвращает в предыдущее меню. (У меня в меню управления устройствами в прихожей)
  • '{{"\U0001F4DC"}} Главное меню:/menu' - возврат в главное меню. (У вас может быть другая команда - меняем на свою)
automation:
  - id: 'telegram_smartintercom'
    alias: Telegram (домофон - menu)
    description: ''
    trigger:
    - platform: event
      event_type: telegram_command
      event_data:
        command: '/smartintercom'
    action:
    - service: telegram_bot.send_message
      data:
        target: '{{ trigger.event.data.user_id }}'
        title: '{{"\U0001F5DD"}} Домофон'
        message: ''
        disable_notification: true
        inline_keyboard:
          - '{% set mode = states("select.smartintercom_modes") %}
             {% if mode == "Не активен" %}
               {{"\U0001F7E2"}}
             {% else %}
               {{"\U0001F534"}}
             {% endif %}
             Не активен:/smartintercom_not_active,
             {% set mode = states("select.smartintercom_modes") %}
             {% if mode == "Открывать всегда" %}
               {{"\U0001F7E2"}}
             {% else %}
               {{"\U0001F534"}}
             {% endif %}
             Открывать всегда:/smartintercom_open_always'
          - '{% if is_state("switch.smartintercom_accept_call", "on") %}
               {{"\U0001F7E2"}}
             {% else %}
               {{"\U0001F534"}}
             {% endif %}
             Открыть:/smartintercom_accept_call,
             {% set mode = states("select.smartintercom_modes") %}
             {% if mode == "Сброс вызова" %}
               {{"\U0001F7E2"}}
             {% else %}
               {{"\U0001F534"}}
             {% endif %}
             Сброс вызова:/smartintercom_reset'
          - '{% if is_state("switch.smartintercom_sound", "on") %}
               {{"\U0001F7E2"}}
             {% else %}
               {{"\U0001F534"}}
             {% endif %}
             Звук:/smartintercom_sound,
             {% if is_state("switch.smartintercom_mute", "on") %}
               {{"\U0001F7E2"}}
             {% else %}
               {{"\U0001F534"}}
             {% endif %}
             Mute:/smartintercom_mute'
          - '{{"\U000021A9"}} Назад:/hallway'
          - '{{"\U0001F4DC"}} Главное меню:/menu'

  - id: 'telegram_smartintercom_callback'
    alias: Telegram (домофон - callback)
    description: ''
    trigger:
    - platform: event
      event_type: telegram_callback
      event_data: {}
    action:
    - choose:
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom" }}'
        sequence:
        - service: telegram_bot.edit_message
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            title: '{{"\U0001F5DD"}} Домофон'
            message: ''
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            inline_keyboard: &keyb
              - '{% set mode = states("select.smartintercom_modes") %}
                 {% if mode == "Не активен" %}
                   {{"\U0001F7E2"}}
                 {% else %}
                   {{"\U0001F534"}}
                 {% endif %}
                 Не активен:/smartintercom_not_active,
                 {% set mode = states("select.smartintercom_modes") %}
                 {% if mode == "Открывать всегда" %}
                   {{"\U0001F7E2"}}
                 {% else %}
                   {{"\U0001F534"}}
                 {% endif %}
                 Открывать всегда:/smartintercom_open_always'
              - '{% if is_state("switch.smartintercom_accept_call", "on") %}
                   {{"\U0001F7E2"}}
                 {% else %}
                   {{"\U0001F534"}}
                 {% endif %}
                 Открыть:/smartintercom_accept_call,
                 {% set mode = states("select.smartintercom_modes") %}
                 {% if mode == "Сброс вызова" %}
                   {{"\U0001F7E2"}}
                 {% else %}
                   {{"\U0001F534"}}
                 {% endif %}
                 Сброс вызова:/smartintercom_reset'
              - '{% if is_state("switch.smartintercom_sound", "on") %}
                   {{"\U0001F7E2"}}
                 {% else %}
                   {{"\U0001F534"}}
                 {% endif %}
                 Звук:/smartintercom_sound,
                 {% if is_state("switch.smartintercom_mute", "on") %}
                   {{"\U0001F7E2"}}
                 {% else %}
                   {{"\U0001F534"}}
                 {% endif %}
                 Mute:/smartintercom_mute'
              - '{{"\U000021A9"}} Назад:/hallway'
              - '{{"\U0001F4DC"}} Главное меню:/menu'
# режим not active
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom_not_active" }}'
        sequence:
        - service: select.select_option
          entity_id: select.smartintercom_modes
          data:
            option: Не активен
        - delay:
            milliseconds: 500
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            disable_notification: true
            inline_keyboard: *keyb
# открывать всегда
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom_open_always" }}'
        sequence:
        - service: select.select_option
          entity_id: select.smartintercom_modes
          data:
            option: Открывать всегда
        - delay:
            milliseconds: 500
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            disable_notification: true
            inline_keyboard: *keyb
# открыть один раз
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom_accept_call" }}'
        sequence:
        - service: switch.toggle
          entity_id: switch.smartintercom_accept_call
        - delay:
            milliseconds: 500
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            disable_notification: true
            inline_keyboard: *keyb
# сброс вызова
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom_reset" }}'
        sequence:
        - service: select.select_option
          entity_id: select.smartintercom_modes
          data:
            option: Сброс вызова
        - delay:
            milliseconds: 500
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            disable_notification: true
            inline_keyboard: *keyb
# sound
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom_sound" }}'
        sequence:
        - service: switch.toggle
          entity_id: switch.smartintercom_sound
        - delay:
            milliseconds: 500
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            disable_notification: true
            inline_keyboard: *keyb
# mute
      - conditions:
        - condition: template
          value_template: '{{ trigger.event.data.command == "/smartintercom_mute" }}'
        sequence:
        - service: switch.toggle
          entity_id: switch.smartintercom_mute
        - delay:
            milliseconds: 500
        - service: telegram_bot.edit_replymarkup
          data:
            message_id: '{{ trigger.event.data.message.message_id }}'
            chat_id: '{{ trigger.event.data.chat_id }}'
            callback_query_id: '{{ trigger.event.data.id }}'
            disable_notification: true
            inline_keyboard: *keyb
    mode: restart

Будут какие-то вопросы - задавайте. По мере возможности отвечу и помогу.

Не компилиться под Windows

Нужно удалить пробелы, чтобы было так [email protected] или убрать версию вообще.

ошибка при компиляции такая

LibraryManager: Installing id=1964 @  1.9.1
UndefinedPackageVersion: Could not find a version that satisfies the requirement ' 1.9.1' for your system 'windows_amd64':
  File "C:\Users\nikol\AppData\Local\Programs\Python\Python39\Lib\site-packages\platformio\builder\main.py", line 168:

Возможно ли открытие по коду

ДД. Ничего не знаю об устройстве аналоговых домофонов, но в порядке бреда, возможно ли реализовать вход по заданному коду. Код проверять по тональному сигналу.

Мануал. Делаем управление домофоном через телеграм

Внешний вид клавиатуры
image

Создадим автоматизацию.
Создайте например файлик с таким именем domofon_control_telegram.yaml и вставьте код ниже. Сам файлик domofon_control_telegram.yaml закидываем в automation old, это автоматизация через yaml. У меня настроено так automation old: !include_dir_merge_list includes/automation

- alias: 'Телеграм: Домофон. Управление'
  description: Управление домофоном через телеграм
  trigger:
  - platform: event
    event_type: telegram_callback
    event_data: {}
  condition: []
  action:
  - choose:
    - conditions:
      - condition: template
        value_template: '{{ trigger.event.data.command == ''/domofon'' }}'
      sequence:
      - service: telegram_bot.send_message
        data:
          target: '{{ trigger.event.data.chat_id }}'
          message: &msg |
            {{'\U00002699'}} **Режим работы домофона**
#Клавиатура
          inline_keyboard: &keyb
          - '{% set domofon_modes = states("input_select.smart_domofon_scrators_modes") %}
             {% if domofon_modes == "Не активен" %} {{"🟢"}}
             {% else %} {{"🔴"}}
             {% endif %} 
             Не активен:/domofon_not_active,
             {% set domofon_modes = states("input_select.smart_domofon_scrators_modes") %}
             {% if domofon_modes == "Открывать всегда" %} {{"🟢"}}
             {% else %} {{"🔴"}}
             {% endif %} 
             Открывать всегда:/domofon_open_always'
          - '{% if is_state("switch.smart_domofon_scrators_mute", "on") %} {{"🟢"}}
             {% else %} {{"🔴"}} 
             {% endif %}
             Беззвучный режим:/domofon_mute,
             {% set domofon_modes = states("input_select.smart_domofon_scrators_modes") %}
             {% if domofon_modes == "Сброс вызова" %} {{"🟢"}}
             {% else %} {{"🔴"}}
             {% endif %} 
             Сброс вызова:/domofon_reset_call'
          - '{% set domofon_modes = states("input_select.smart_domofon_scrators_modes") %}
             {% if domofon_modes == "Сброс вызова если нет ответа" %} {{"🟢"}}
             {% else %} {{"🔴"}}
             {% endif %} 
             Сброс вызова если нет ответа:/domofon_resetting_call_no_response'
          - Назад:/backhome

#Кнопка №1. Не активен
    - conditions:
      - condition: template
        value_template: '{{ trigger.event.data.command == "/domofon_not_active" }}'
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.smart_domofon_scrators_modes
        data:
          option: Не активен
      - delay:
          milliseconds: 300
      - service: telegram_bot.edit_message
        data:
          message_id: '{{ trigger.event.data.message.message_id }}'
          chat_id: '{{ trigger.event.data.user_id }}'
          callback_query_id: '{{ trigger.event.data.id }}'
          message: *msg
          inline_keyboard: *keyb

#Кнопка №2. Открывать всегда
    - conditions:
      - condition: template
        value_template: '{{ trigger.event.data.command == "/domofon_open_always" }}'
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.smart_domofon_scrators_modes
        data:
          option: Открывать всегда
      - delay:
          milliseconds: 300
      - service: telegram_bot.edit_message
        data:
          message_id: '{{ trigger.event.data.message.message_id }}'
          chat_id: '{{ trigger.event.data.user_id }}'
          callback_query_id: '{{ trigger.event.data.id }}'
          message: *msg
          inline_keyboard: *keyb

#Кнопка №3. Беззвучный режим
    - conditions:
      - condition: template
        value_template: '{{ trigger.event.data.command == "/domofon_mute" }}'
      sequence:
      - service: switch.toggle
        target:
          entity_id: switch.smart_domofon_scrators_mute
      - delay:
          milliseconds: 300
      - service: telegram_bot.edit_message
        data:
          message_id: '{{ trigger.event.data.message.message_id }}'
          chat_id: '{{ trigger.event.data.user_id }}'
          callback_query_id: '{{ trigger.event.data.id }}'
          message: *msg
          inline_keyboard: *keyb

#Кнопка №4. Сброс вызова
    - conditions:
      - condition: template
        value_template: '{{ trigger.event.data.command == "/domofon_reset_call" }}'
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.smart_domofon_scrators_modes
        data:
          option: Сброс вызова
      - delay:
          milliseconds: 300
      - service: telegram_bot.edit_message
        data:
          message_id: '{{ trigger.event.data.message.message_id }}'
          chat_id: '{{ trigger.event.data.user_id }}'
          callback_query_id: '{{ trigger.event.data.id }}'
          message: *msg
          inline_keyboard: *keyb

#Кнопка №5. Сброс вызова если нет ответа
    - conditions:
      - condition: template
        value_template: '{{ trigger.event.data.command == "/domofon_resetting_call_no_response" }}'
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.smart_domofon_scrators_modes
        data:
          option: Сброс вызова если нет ответа
      - delay:
          milliseconds: 300
      - service: telegram_bot.edit_message
        data:
          message_id: '{{ trigger.event.data.message.message_id }}'
          chat_id: '{{ trigger.event.data.user_id }}'
          callback_query_id: '{{ trigger.event.data.id }}'
          message: *msg
          inline_keyboard: *keyb
    default: []
  mode: restart

Управление домофоном через Алису

Так как умный дом Яндекс имеет свои ограничения, то пришлось немного поизвращаться и... ну как получилось, так получилось.
Но работает без проблем!

smartalice

Примечание:
У меня домофон назван как "smartintercom". Так что обратите внимание на название переключателей его состояния и поменяйте на свое в скрипте, сенсорах и настройках интеграции yandex_smart_home

Для управления домофоном при помощи Умного дома Яндекс должна быть установлена и настроена интеграция yandex_smart_home. Если это уже сделано - пропускаем этот шаг и идем дальше.

Создаем следующий скрипт, который будет устанавливать нужный режим на домофоне:

script:
  smartintercom_mode_set:
    alias: Домофон (установка режима)
    sequence:
    - service: select.select_option
      entity_id: select.smartintercom_modes
      data:
        option: >
          {% if mode == "normal" %}
            Не активен
          {% elif mode == "auto" %}
            Открывать всегда
          {% else %}
            Сброс вызова
          {% endif %}
    mode: queued

Следом создаем пару сенсоров:

sensor:
  - platform: template
    sensors:
      smartintercom_modes:
        value_template: >
          {% if is_state('select.smartintercom_modes', 'Не активен') %}
            normal
          {% elif is_state('select.smartintercom_modes', 'Открывать всегда') %}
            auto
          {% else %}
            quiet
          {% endif %}
      smartintercom_sound_invert:
        value_template: >
          {% if is_state("switch.smartintercom_sound", "on") %}
            off
          {% else %}
            on
          {% endif %}

Первый сенсор "smartintercom_modes" - преобразует режим домофона в режим Умного дома Яндекс, второй - инвертирует состояние переключателя "switch.smartintercom_sound". Сделано по причине того, что Умный дом Яндекс имеет кнопку "Без звука". То есть если она включена, то звука нет. А в плате домофона наоборот, если включено, то звук есть.
Под звуком подразумевается произношение фразы при открытии!

Следом в настройках интеграции "yandex_smart_home", если у вас настроены фильтры, вставляем:

  filter:
    include_entities:
### Прихожая
      - switch.smartintercom_accept_call    # домофон

Еще раз обращаю внимание на название домофона!

Следом, в разделе настроек интеграции " entity_config:" вносим следующие строки:

    switch.smartintercom_accept_call:
      name: Домофон
      room: Прихожая
      type: devices.types.openable
      modes:
        program:
          normal: [normal]
          quiet: [quiet]
          auto: [auto]
      custom_modes:
        program:
          state_entity_id: sensor.smartintercom_modes
          set_mode:
            service: script.smartintercom_mode_set
            data:
              mode: '{{ mode }}'
      custom_toggles:
        backlight:
          state_entity_id: switch.smartintercom_led
          turn_on:
            service: switch.turn_on
            entity_id: switch.smartintercom_led
          turn_off:
            service: switch.turn_off
            entity_id: switch.smartintercom_led
        mute:
          state_entity_id: sensor.smartintercom_sound_invert
          turn_on:
            service: switch.turn_off
            entity_id: switch.smartintercom_sound
          turn_off:
            service: switch.turn_on
            entity_id: switch.smartintercom_sound

И снова обратите внимание на имя домофона!

Сохраняем настройки и обновляем интеграцию. Ну или перезапускаем Home Assistant.

После этого идем в установленный на смарте "Умный дом с Алисой" и там добавляем новое устройство.
Пользуемся!

Рекомендую посмотреть какие команды надо озвучивать Алисе для правильной работы.

Команда "Открыть домофон" - открывает его на один раз. Соответственно наоборот "Закрыть домофон" - отключает однократное открытие.
Команда "Выключить звук на домофоне" - отключает произношение фразы и наоборот - "Включить звук на домофоне"

Можно менять режим фразами:
"Домофон установить режим" или "Домофон установить программу":

"нормальный" - Не активен
"тихий/тихо" - Сброс вызова (тут вопрос к яндексу - слово "тихий" срабатывает не всегда)
"авто" - Открывать всегда

"Включить/выключить подсветку на домофоне" - тут и так понятно, да и не особо-то и нужно.

Последняя прошивка ESPHome 2024.5.2 сломала SmartIntercom

Добрый день!

Кнопки с дашборда HA перестали адекватно нажиматься и менять статус
Курьеру звук не воспроизводится
Нет статуса Открытие двери
По FTP файлы видны, но скачать их нельзя

image

INFO ESPHome 2024.5.2
INFO Reading configuration /config/esphome/smartintercom-esp8266.yaml...
INFO Starting log output from 192.168.0.48 using esphome API
INFO Successfully connected to smartintercom @ 192.168.0.48 in 0.005s
INFO Successful handshake with smartintercom @ 192.168.0.48 in 0.028s
[12:26:05][I][app:100]: ESPHome version 2024.5.2 compiled on May 22 2024, 23:19:23
[12:26:05][C][status_led:065]: Status Led Light:
[12:26:05][C][wifi:431]:   DNS2: 0.0.0.0
[12:26:05][C][logger:189]:   Hardware UART: UART0
[12:26:05][C][template.number:050]: Template Number 'smartintercom_before_answer'
[12:26:05][C][template.number:050]: Template Number 'smartintercom_open_time'
[12:26:05][C][template.number:050]:   Unit of Measurement: 'мс'
[12:26:05][C][template.number:050]: Template Number 'smartintercom_after_close'
[12:26:05][C][template.number:050]:   Unit of Measurement: 'мс'
[12:26:05][C][template.select:065]: Template Select 'smartintercom_modes'
[12:26:05][C][template.select:066]:   Update Interval: 60.0s
[12:26:05][C][template.text_sensor:020]: Template Sensor 'smartintercom_line_status'
[12:26:05][C][template.text_sensor:020]:   Icon: 'mdi:bell'
[12:26:05][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'smartintercom_external_button'
[12:26:05][C][gpio.binary_sensor:016]:   Pin: GPIO1
[12:26:05][C][gpio.output:010]: GPIO Binary Output:
[12:26:05][C][gpio.output:011]:   Pin: GPIO5
[12:26:05][C][esp8266_pwm:022]: ESP8266 PWM:
[12:26:05][C][gpio.output:010]: GPIO Binary Output:
[12:26:05][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'smartintercom_button'
[12:26:05][C][gpio.binary_sensor:016]:   Pin: GPIO0
[12:26:05][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'smartintercom_line_detect'
[12:26:05][C][gpio.binary_sensor:016]:   Pin: GPIO12
[12:26:05][C][light:103]: Light 'led_status'
[12:26:05][C][template.switch:068]: Template Switch 'smartintercom_delivery'
[12:26:05][C][template.switch:090]:   Restore Mode: always OFF
[12:26:05][C][template.switch:070]:   Icon: 'mdi:door-open'
[12:26:05][C][template.switch:070]:   Icon: 'mdi:phone-hangup'
[12:26:05][C][template.switch:070]:   Icon: 'mdi:bell-off'
[12:26:05][C][template.switch:070]:   Icon: 'mdi:phone-off'
[12:26:05][C][template.switch:070]:   Icon: 'mdi:led-on'
[12:26:05][C][template.switch:070]:   Icon: 'mdi:volume-high'
[12:26:05][C][wifi_info:013]: WifiInfo Mac Address 'smartintercom_mac'
[12:26:05][C][restart.button:017]: Restart Button 'smartintercom_restart'
[12:26:05][C][captive_portal:088]: Captive Portal:
[12:26:05][C][mdns:115]: mDNS:
[12:26:05][C][mdns:116]:   Hostname: smartintercom
[12:26:05][C][ota:096]: Over-The-Air Updates:
[12:26:05][C][api:139]: API Server:
[12:26:05][C][wifi_info:011]: WifiInfo SSID 'smartintercom_ssid'
[12:26:05][C][wifi_info:011]:   Icon: 'mdi:wifi'
[12:26:05][C][wifi_signal.sensor:009]: WiFi Signal 'smartintercom_rssi'
[12:26:05][C][wifi_signal.sensor:009]:   Device Class: 'signal_strength'
[12:26:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:26:43][D][switch:012]: 'smartintercom_delivery' Turning ON.
[12:26:43][D][switch:055]: 'smartintercom_delivery': Sending state ON
[12:26:44][D][switch:016]: 'smartintercom_reject_call' Turning OFF.
[12:26:44][D][light:036]: 'led_status' Setting:
[12:26:44][W][component:237]: Component api took a long time for an operation (60 ms).
[12:26:44][D][switch:012]: 'smartintercom_sound' Turning ON.
[12:26:44][D][switch:012]: 'smartintercom_led' Turning ON.
[12:26:44][D][light:036]: 'led_status' Setting:
[12:26:44][D][status_led:050]: 'led_status': Setting state OFF
[12:27:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:27:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:27:11][D][switch:012]: 'smartintercom_accept_call' Turning ON.
[12:27:11][D][switch:016]: 'smartintercom_reject_call' Turning OFF.
[12:27:11][D][main:761]: Accept call switch is ON
[12:27:11][D][light:109]:   Effect: 'blink'
[12:27:13][D][esp8266.preferences:238]: Saving preferences to flash...
[12:28:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:28:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:28:49][D][switch:016]: 'smartintercom_delivery' Turning OFF.
[12:28:49][D][switch:055]: 'smartintercom_delivery': Sending state OFF
[12:28:49][D][switch:012]: 'smartintercom_sound' Turning ON.
[12:28:49][D][switch:012]: 'smartintercom_led' Turning ON.
[12:28:49][D][light:109]:   Effect: 'blink'
[12:28:49][D][switch:012]: 'smartintercom_phone_disable' Turning ON.
[12:28:50][D][switch:012]: 'smartintercom_accept_call' Turning ON.
[12:28:50][D][switch:016]: 'smartintercom_reject_call' Turning OFF.
[12:28:50][D][light:036]: 'led_action' Setting:
[12:28:50][D][status_led:050]: 'led_status': Setting state OFF
[12:28:52][D][switch:012]: 'smartintercom_delivery' Turning ON.
[12:28:52][D][switch:055]: 'smartintercom_delivery': Sending state ON
[12:28:52][D][light:047]:   State: OFF
[12:28:52][D][light:036]: 'led_status' Setting:
[12:28:52][W][component:237]: Component api took a long time for an operation (61 ms).
[12:28:52][D][switch:012]: 'smartintercom_sound' Turning ON.
[12:28:52][D][switch:012]: 'smartintercom_led' Turning ON.
[12:28:52][D][light:109]:   Effect: 'blink'
[12:29:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:29:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:29:13][D][esp8266.preferences:238]: Saving preferences to flash...
[12:29:31][D][sensor:093]: 'smartintercom_rssi': Sending state -61.00000 dBm with 0 decimals of accuracy
[12:30:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:30:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:31:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:31:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:31:55][D][binary_sensor:036]: 'smartintercom_line_detect': Sending state ON
[12:31:55][D][light:036]: 'led_action' Setting:
[12:31:55][D][light:047]:   State: ON
[12:31:55][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Вызов'
[12:31:56][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Ответ'
[12:31:57][D][audio:075]: Stopped playing
[12:31:57][D][audio:112]: Failed to play audio file /delivery_access_allowed.wav
[12:31:57][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Открытие двери'
[12:31:58][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Сброс вызова'
[12:32:00][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:32:00][D][switch:016]: 'smartintercom_accept_call' Turning OFF.
[12:32:00][D][switch:055]: 'smartintercom_delivery': Sending state OFF
[12:32:00][D][light:036]: 'led_action' Setting:
[12:32:00][D][light:036]: 'led_status' Setting:
[12:32:00][D][switch:016]: 'smartintercom_delivery' Turning OFF.
[12:32:00][D][light:047]:   State: ON
[12:32:00][D][status_led:050]: 'led_status': Setting state OFF
[12:32:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:32:04][D][binary_sensor:036]: 'smartintercom_line_detect': Sending state OFF
[12:32:04][D][main:622]: Incoming call completed
[12:32:04][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:32:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:32:13][D][esp8266.preferences:238]: Saving preferences to flash...
WARNING smartintercom @ 192.168.0.48: Connection error occurred: smartintercom @ 192.168.0.48: EOF received
INFO Processing unexpected disconnect from ESPHome API for smartintercom @ 192.168.0.48
WARNING Disconnected from API
INFO Successfully connected to smartintercom @ 192.168.0.48 in 0.004s
WARNING smartintercom @ 192.168.0.48: Connection error occurred: smartintercom @ 192.168.0.48: EOF received
WARNING Can't connect to ESPHome API for smartintercom @ 192.168.0.48: smartintercom @ 192.168.0.48: EOF received (SocketClosedAPIError)
INFO Trying to connect to smartintercom @ 192.168.0.48 in the background
INFO Successfully connected to smartintercom @ 192.168.0.48 in 0.011s
INFO Successful handshake with smartintercom @ 192.168.0.48 in 0.021s
[12:33:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:33:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'
[12:34:02][D][text_sensor:064]: 'smartintercom_line_status': Sending state 'Закрыто'
[12:34:08][D][text_sensor:064]: 'smartintercom_fs_used': Sending state '1.05 MB'

Настройки не сохраняются

Похоже, когда обновляется ESPHome интеграция в HomeAssistan, то сбрасываются настройки, например, у меня не подключена трубка домофона, и после автообновления, домофон не открывается для курьера с ошибкой Error на дисплее, а потом оказывается что smartintercom_phone_disable=false как и светодиод и проигрывание звука.
Галочку ставил, Save нажимал, но не помогает

Заюзать UART

Здравствуйте! Можно ли заюзать на платке с ESP8266 GPIO1 и GPIO3, подпаятся к ним? хочу с датчиком приближения совместить HLK-LD2410? потянет?

Вопросы и пожелания

Можно ли узнать функции данного устройства? Так же хотелось бы увидеть хотя бы краткое видео устройства в работе. И для людей не использующих НА была бы очень полезна поддержка mqtt, тогда мы могли бы использовать это чудо устройство с другими умными домами. Я могу подключить это чудо устройство к аналоговому домофону?

Управление домофоном через Алису (второй вариант)

Умный Дом Яндекс, как я писал в прошлом подключении управления через Алису, накладывает некоторые ограничения на функционал. Ну и поступила жалоба, что в предыдущих настройках при выключенной функции "Однократного открытия домофона" в программе "Умный дом с Алисой" все переключатели заблокированы. Голосом они управляются, а вот в программе нет.

Будем избавляться от этого недостатка...

Примечание: создание настроек описано с нуля
smartintercom
Для управления домофоном при помощи Умного дома Яндекс должна быть установлена и настроена интеграция yandex_smart_home. Если это уже сделано - пропускаем этот шаг и идем дальше.

Создаем следующий скрипт, который будет устанавливать нужный режим на домофоне:

script:
  smartintercom_mode_set:
    alias: Домофон (установка режима)
    sequence:
    - service: select.select_option
      entity_id: select.smartintercom_modes
      data:
        option: >
          {% if mode == "normal" %}
            Не активен
          {% elif mode == "auto" %}
            Открывать всегда
          {% else %}
            Сброс вызова
          {% endif %}
    mode: queued

Создаем сенсоры:

sensor:
  - platform: template
    sensors:
      smartintercom_modes:
        value_template: >
          {% if is_state('select.smartintercom_modes', 'Не активен') %}
            normal
          {% elif is_state('select.smartintercom_modes', 'Открывать всегда') %}
            auto
          {% else %}
            quiet
          {% endif %}
      smartintercom_sound_invert:
        value_template: >
          {% if is_state("switch.smartintercom_sound", "on") %}
            off
          {% else %}
            on
          {% endif %}
      smartintercom_accept_call_invert:
        value_template: >
          {% if is_state("switch.smartintercom_accept_call", "on") %}
            off
          {% else %}
            on
          {% endif %}

Первый сенсор "smartintercom_modes" - преобразует режим домофона в режим Умного дома Яндекс, второй - инвертирует состояние переключателя "switch.smartintercom_sound".
Под звуком подразумевается произношение фразы при открытии!
Третий сенсор "smartintercom_accept_call_invert" инвертирует состояние однократного открытия.
Инвертирование сделано по причине того, что имеется различие в состоянии на Яндексе и состоянии домофона.

Создаем бинарный сенсор состояния домофона на основе "switch.smartintercom_accept_call"

template:
  - binary_sensor:
    - name: "smartintercom state"
      device_class: "door"
      state: '{{ states("switch.smartintercom_accept_call") }}'

Именно этот сенсор и будет показывать текущее состояние домофона.
В комментарии есть еще одна настройка этого сенсора. Какой вам больше нравится - тот и используйте.

Следом в настройках интеграции "yandex_smart_home", если у вас настроены фильтры, вставляем созданный бинарный сенсор:

  filter:
    include_entities:
      - binary_sensor.smartintercom_state # домофон

В разделе настроек интеграции " entity_config:" вносим следующие строки:

    binary_sensor.smartintercom_state:
      name: Домофон
      room: Прихожая
      type: devices.types.openable
      modes:
        program:
          normal: [normal]
          quiet: [quiet]
          auto: [auto]
      custom_modes:
        program:
          state_entity_id: sensor.smartintercom_modes
          set_mode:
            service: script.smartintercom_mode_set
            data:
              mode: '{{ mode }}'
      custom_toggles:
        controls_locked:
          state_entity_id: sensor.smartintercom_accept_call_invert
          turn_on:
            service: switch.turn_off
            entity_id: switch.smartintercom_accept_call
          turn_off:
            service: switch.turn_on
            entity_id: switch.smartintercom_accept_call
        backlight:
          state_entity_id: switch.smartintercom_led
          turn_on:
            service: switch.turn_on
            entity_id: switch.smartintercom_led
          turn_off:
            service: switch.turn_off
            entity_id: switch.smartintercom_led
        mute:
          state_entity_id: sensor.smartintercom_sound_invert
          turn_on:
            service: switch.turn_off
            entity_id: switch.smartintercom_sound
          turn_off:
            service: switch.turn_on
            entity_id: switch.smartintercom_sound

Установленный тип датчика "type: devices.types.openable" - не влияет ни на что, кроме иконки устройства
Проверяем конфигурацию и если все в порядке, то перегружаем Home Assistant.

После этого идем в установленный на смарте "Умный дом с Алисой" и там добавляем новое устройство. Если было сделано по предыдущему руководству, то предварительно удаляем старое устройство.
Пользуемся! Все функции управления черед программу разблокированы всегда.

Теперь по поводу команд!
Вместо команды "Открыть/Закрыть домофон", придется говорить "Разблокировать домофон" и соответственно "Заблокировать домофон". Остальные команды не претерпели никаких изменений.

MQTT шаблон для Sprut.hub

Тестировалось на плате Smartintercom Nelma 4 (rev. 4E, ESP32, ESPHome) Ext.

Сначала включаем протокол MQTT, для этого в конфиге smartintercom-esp32.yaml (113 строчка) прописываем следующее:

mqtt:
  broker: "IP"
  port: "44444"
  username: ""
  password: ""
  # Необязательно
  client_id: "domofon"
  # Отключаем discovery для HA
  discovery: false
  # Меняем префикс для удобства (необязательно)
  topic_prefix: "domofon"
  • broker — IP-адрес Sprut.hub'a;
  • port — порт брокера из настроек MQTT-контроллера Sprut.hub'a;
  • username — имя пользователя;
  • password — пароль;
  • client_id — айди клиента с которым плата будет коннектится к брокеру (необязательно);
  • discovery — отключаем discovery-режим для HomeAssistant, нужен для работы по MQTT с HomeAssistant;
  • topic_prefix — под каким префиксом в брокере будут отображаться сообщения платы (необязательно, для удобства);

Также не забываем отключить API-компонент ESPHome (120 строчка):
#api:

Далее в соответствии с инструкцией добавляем шаблон SCHome_Smartintercom_v2.5.json в Sprut.hub.

После перезагрузки MQTT-контроллера в Sprut.hub у вас появится устройство «Домофон».

Снимок экрана 2024-05-04 в 22 35 51 Снимок экрана 2024-05-04 в 22 36 48 Снимок экрана 2024-05-04 в 22 36 38

Создание своего бота в телеграм

Для управления умным домом и его устройствами через Телеграм, требуется создание своего бота.
Вот этим мы и займемся...

В поиске ищем @ВоtFather - это официальный бот Телеграма, созданный специально для управления ботами.
Если раньше им не пользовались, то нажимаем кнопку "Запустить" - собственно ничего другого в чате бота и не будет.

Появится меню бота:
изображение

В меню очень много возможностей, из которых нас интересует пока только одна - создание бота, это команда /newbot или эта же команда вызванная из "Меню", расположенного внизу слева.
Вызываем команду...
BotFather попросит указать имя бота - имя можете задать любое например "Бот умного дома".
изображение

Следом BotFather попросит ввести имя бота обязательно заканчивающее на "bot". Имя вводится на латинице и должно быть уникальным!
Если бот с таким именем уже существует, то появится сообщение с просьбой использовать другое имя:
изображение

Для примера я ввел имя - smarthome121_ha_bot
Появится сообщение о создании бота, в котором нам понадобится токен, при помощи которого мы и будем с ним работать:
(Особо хитрых сразу предупреждаю - бот был создан для примера и сразу же удален! Так что не пытайтесь его взломать по токену с картинки!)
изображение

Полученный токен сохраняем в файле secrets.yaml в Home Assistant:

# id:token - smarthome121_ha_bot
telegram_token: 5739678252:AAHq5KAwPaVDBgqLrpbMALOxTwTt8mLWYc4

Далее, для настройки бота в Home Assistant нам понадобится узнать свой "id".

В поиске ищем - @getmyid_bot и запускаем его.
Появится сообщение:

Your user ID: 457173212
Current chat ID: 457173212

Это и есть ваш идентификатор в телеграм.
Если вам надо узнать "id" собеседника - например жены, то просто перешлите боту @getmyid_bot сообщение полученное от неё. (Не свое ей, не пересланное ей, а именно написанное ей и присланное вам - это важно!) И получите третью строку:

Your user ID: 457173212
Current chat ID: 457173212
Forwarded from: 1311585534

Полученные id так же записываем в файл secrets.yaml:

# telegram chats
telegram_chat_my: 457173212
telegram_chat_wife: 1311585534

Осталось только настроить телеграм бот в Home Assistant. Тут все просто - в файл configuration.yaml пищем вот эти строки

telegram_bot:
  - platform: polling
    api_key: !secret telegram_token
    parse_mode: html
    allowed_chat_ids:
      - !secret telegram_chat_my
      - !secret telegram_chat_wife

Теперь вы можете отправлять в ваш бот сообщения - например так:

- service: telegram_bot.send_message
  data:
    title: "Умный дом сообщает"
    message: "У меня все хорошо работает!"
    target:
      - !secret telegram_chat_my
      - !secret telegram_chat_wife

Используя встроенные в Home Assistant команды, можно отправлять, файлы, картинки, видео. Но это уже тема отдельного разговора...

Автоматическое отключение однократного открытия домофона

Иногда бывает подал команду открыть домофон и забыл отменить. Потому небольшая автоматизация для людей с некоторым количеством склероза - как я например.

Создаем таймер:

smartintercom_wait:
  name: 'Домофон автовыключение открытия'
  duration: '00:10:00'

... естественно, что время автоматического выключения можете сделать свое. В примере 10 минут.

Далее создаем три автоматизации:

automation:
  - id: 'smartintercom_accept_call_on'
    alias: Домофон (включается accept_call)
    description: ''
    trigger:
    - platform: state
      entity_id: switch.smartintercom_accept_call
      from: 'off'
      to: 'on'
    condition: []
    action:
    - service: timer.start
      entity_id: timer.smartintercom_wait
    mode: single

  - id: 'smartintercom_accept_call_off'
    alias: Домофон (выключается accept_call)
    description: ''
    trigger:
    - platform: state
      entity_id: switch.smartintercom_accept_call
      from: 'on'
      to: 'off'
    condition: []
    action:
    - service: timer.cancel
      entity_id: timer.smartintercom_wait
    mode: single

  - id: 'smartintercom_timer_finished'
    alias: Домофон (обработчик таймера accept_call)
    description: ''
    trigger:
    - platform: event
      event_type: timer.finished
      event_data:
        entity_id: timer.smartintercom_wait
    condition:
    - condition: state
      entity_id: switch.smartintercom_accept_call
      state: 'on'
    action:
    - service: switch.turn_off
      target:
        entity_id: switch.smartintercom_accept_call
    mode: single

Первая "smartintercom_accept_call_on" - запускает созданный выше таймер при открытии домофона.
Вторая "smartintercom_accept_call_off" - останавливает запущенный таймер при отключении однократного открытия домофона.
И третья "'smartintercom_timer_finished" - ни что иное, как обработчик таймера. Который по истечении времени так же отключит однократное открытие.

Перегружаем в Home Assistant автоматизации и таймеры и склероз побежден. :))

Устройство в сети но недоступно в HA, при подключении по Type C нет COM порта

Добрый день! залили такой

Конфиг
substitutions:
dev_name: smartintercom

#ESP8266 Определение нужных GPIO
base: esp12e
led_status: GPIO2             # Индикатор статуса API, GPIO2 - это встроенный синий светодиод на ESP12
led_indicator: GPIO13         # Дополнительный индикатор, который будет показывать режимы и прочее.
detect_line: GPIO12           # Пин детектора вызова
button_boot: GPIO0            # Кнопка управления платой и перевода в режим прошивки
button_ring: GPIO1            # Внешняя кнопка
relay_line: GPIO14            # Пин "Переключение линии, плата/трубка"
switch_open: GPIO5            # Пин "Открытие двери"
switch_phone: GPIO4           # Пин "Трубка положена/поднята"

#input_select_mode_value
input_select_disable: "Не активен"
input_select_no_answer: "Сброс вызова если нет ответа" 
input_select_reject: "Сброс вызова"
input_select_accept: "Открывать всегда"

#line_status_text
line_status_call:   "Вызов"
line_status_answer: "Ответ"
line_status_open:   "Открытие двери"
line_status_reject: "Сброс вызова"
line_status_close:  "Закрыто"

#delay
call_end_detect_delay: 4000ms     # Интервал между детектированием вызова
# delay_before_answer: 1000ms       # Отпределили вызов, *** подождали ***... Передаем управление на плату,
                                  # отключаем трубку, *** подождали *** ... воспроизводим аудио, если надо. (Number компонент before_answer)
delay_before_open_door: 100ms     # Воспроизведение аудио закончилось, *** подождали *** ... нажимаем кнопку открытия двери.
# delay_open_on_time: 600ms         # Кнопка открытия двери нажата, *** подождали *** ... отпустили кнопку. (Number компонент open_time)
# delay_after_close_door: 2000ms    # Отпустили кнопку открытия двери, *** подождали *** ... Возвращаем управление на трубку (Number компонент after_close)
delay_no_answer: 30s              # Пауза для режима "Сброс если нет ответа" - сколько этот ответ плата ждёт

#audio_support
play_user_access_allowed: playFile(audio_player, "/user_access_allowed.wav")
play_delivery_access_allowed: playFile(audio_player, "/delivery_access_allowed.wav")
play_access_denied: playFile(audio_player, "/access_denied.wav")
play_user_no_connect: playFile(audio_player, "/user_no_connect.wav")
play_user_no_answer: playFile(audio_player, "/user_no_answer.wav")

# Логика работы:
# 
# Определение "Вызова", интеревал между детектированием - call_end_detect_delay (3 сек.)
# Включение LED индикатора в режим быстрого мигания.
#
# +-----------Если включен режим MUTE-----------+ Это позволяет при вызове быстро передать управление
# | Включение на плате режима "трубка положена" | на плату, и трубка не успевает издать звук вызова.
# | Переключение управления на плату            | При этом на плате устанавливается режим положеной
# +---------------------------------------------+ трубки, поэтому на блоке вызова просто идет вызов.
#
# delay_before_switch_line: (1000 мсек.)          Ждем, чтобы "желательно" попасть в паузу между
#                                                 вызовными сигналами, заодно чтобы блок вызова
#                                                 успел перейти в режим работы с абонентом, - малоли.
#
# +---Если режим "сброс, если нет ответа"-------+ Если установлен этот режим, то просто ждем 30 сек.
# | delay_no_answer (30 сек)                    | и запускаем скрипт сброса звонка.
# | Включение режима "сброс"                    |
# +---------------------------------------------+        
#
# +---Если включен какой-нибудь режим работы----+ Если выбран какой-либо режим кроме "Неактивен",
# | Переключение управления на плату            | то начинаем работу по отработке вызова.
# | "Поднимаем трубку"                          | Делаем поднятие трубки, малоли был режим мьюта.
# | delay_before_voice (1000 мсек.)             | Ждем, чтобы блок вызова успел отработать поднятие
# |                                             | трубки, и дать работу с аудио трактом.
# | +--Если режим курьера или аудио включено--+ | Если режим курьера или включено аудио сообщение,
# | | Воспроизведение аудио                   | | то собственно воспроизводим аудио, и ждем окончания
# | +-----------------------------------------+ | воспроизведения
# |                                             |
# | +--Если открывающий режим-----------------+ | Открывающий режим - разовый/постоянный или "курьер"
# | | delay_before_open_door (100 мсек.)      | | Ждем немного, чтобы с аудио, которое воспроизводилось
# | | Нажатие кнопки открытия двери.          | | на блоке вызова не обрывало. И жмём "Открыть"
# | +-----------------------------------------+ |
# |                                             | 
# | delay_open_on_time (600 мсек.)              | Ждем, чтобы блок вызова успел переварить сигналы.
# | Отпускание кнопки открытия двери.           | Отпускаем кнопку открытия, если не была нажата - 
# | delay_after_close_door (2000 мсек.)         | ну и пофиг. Ждем, перед сбросом. Если не ждать, 
# | Переключаем линию назад на трубку           | то может детектор отработать еще раз, и будет 
# +---------------------------------------------+ по кругу гонять, пока на блоке вызова сброс не нажмут.
#                                                 Переключаем линию на трубку, а она у нас положена,
#                                                 и поэтому блок вызова отпеределяет это как
#                                                 положили трубку и завершает сеанс вызова.
#
# Ожидание окончания связи с блоком вызова          
# Выключение режима "положенной трубки"          Выключение GPIO, чтобы энергию не кушал,
# Переключение линии назад на трубку             а физическая трубка положена, и она будет на линии.
# Выключение LED индикатора
uart:
id: uart10
tx_pin: GPIO16
rx_pin: GPIO2
baud_rate: 256000
stop_bits: 1

esp8266:
board: ${base}
restore_from_flash: true

esphome:
name: ${dev_name}
comment: "Перед прошивкой проверь наличие настроек wifi_ssid и wifi_password в файле \"SECRETS\" - кнопка вверху справа"
libraries:
  - SPI
  - ESP8266SdFat
  - SDFS
  - SD
  - ESP8266WiFi
  - LittleFS
  - I2S
  - https://github.com/SCratORS/FTPClientServer
  - ESP8266Audio
includes:
  - lib/ESPUtils.h
  - lib/ESPAudio.h
platformio_options:
    board_build.f_cpu: 160000000L
    board_build.filesystem: littlefs
    board_build.ldscript: eagle.flash.4m2m.ld   
#      build_flags: 
#        - "-DSDCARD" # Поддержка SD карты 

on_boot:
  priority: -100
  then:
    - script.execute: boot_script

# Настройки Вай-Фая тащим из файла секретов, или вписывай руками  
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:

# Включаем доступ к каптиву - это для подключения к домашнему Вай-Фаю через Веб-морду 
captive_portal:

# Включаем дефолтное логирование. 
logger:
baud_rate: 0

# Постоянная Веб-морда
#web_server:
#  local: true # Запрет доступа из внешней сети

# Глобальные переменные
globals:
- id: current_mode
  type: int
  initial_value: '0'
  restore_value: true
- id: status_line
  type: bool
  initial_value: 'false'
- id: status_mute
  type: bool
  initial_value: 'false'
  restore_value: true
- id: status_phone_disable
  type: bool
  initial_value: 'false'
  restore_value: true
- id: status_leding
  type: bool
  initial_value: 'true'
  restore_value: true
- id: status_sound
  type: bool
  initial_value: 'true'
  restore_value: true
- id: status_once_mode
  type: int
  initial_value: '0'
  restore_value: true


# MQTT и API вместе работать не могут. Выбери что надо.
# +---------------------------------------------+
# Активируем работу по протоколу MQTT    
# +---------------------------------------------+
#mqtt:
#broker: 192.168.0.254
#username: "mqtt-client"
#password: "j3qq4h7h2v2hch4m3hk86m8vw" 
# +---------------------------------------------+
# Активируем работу с API HomeAssistans через интеграцию ESPHome
# +---------------------------------------------+
api:
# +---------------------------------------------+

# Возможность обновляться по воздуху
ota:
password: "12345678"

custom_component:
- id: ftp_server
  lambda: 'return {new FTPSrv("","")};' # (Логин, Пароль). По умолчанию anonymous  
- id: audio_player
  lambda: 'return {new ESPAudio()};'
- id: updater
  lambda: 'return {new FirmwareUpdate()};'
ld2410:
# Пошла мазута
light:
- platform: status_led
  id: led_status
  internal: true
  pin:
    number: $led_status
    inverted: True
  effects:
    - strobe:
        name: blink
        colors:
          - state: true
            duration: 100ms
          - state: false
            duration: 1900ms
- platform: monochromatic
  id: led_action
  output: indicator
  internal: true
  restore_mode: ALWAYS_OFF
  default_transition_length: 0ms
  effects:
    - pulse:
        name: pulse
        update_interval: 2s
    - strobe:
        name: blink
        colors:
          - state: true
            duration: 100ms
          - state: false
            duration: 1900ms
    - strobe:
        name: calling
        colors:
          - state: true
            duration: 50ms
          - state: false
            duration: 50ms

script:
- id: boot_script
  then:
    - logger.log: "Boot config"
    - if:
        condition:
          lambda: 'return id(current_mode) == 0;'
        then:
          - select.set:
              id: mode_select
              option: ${input_select_disable}
          - logger.log: ${input_select_disable}
        else:      
          if:
            condition:
              lambda: 'return id(current_mode) == 1;'
            then:
              - select.set:
                  id: mode_select
                  option: ${input_select_no_answer}
              - logger.log: ${input_select_no_answer}
            else:
              if:
                condition:
                  lambda: 'return id(current_mode) == 2;'
                then:
                  - select.set:
                      id: mode_select
                      option: ${input_select_reject}
                  - logger.log: ${input_select_reject}
                else:   
                  - select.set:
                      id: mode_select
                      option: ${input_select_accept}
                  - logger.log: ${input_select_accept}
    - if:
        condition:
          lambda: 'return id(status_leding);'
        then:
          switch.turn_on: led
    - if:
        condition:
          lambda: 'return id(status_sound);'
        then:
          switch.turn_on: sound
    - if:
        condition:
          lambda: 'return id(status_mute);'
        then:
          switch.turn_on: mute
    - if:
        condition:
          lambda: 'return id(status_phone_disable);'
        then:
          switch.turn_on: phone_disable
    - if:
        condition:
          lambda: 'return id(status_once_mode) == 1;'
        then:
          switch.turn_on: accept_call
        else:
          if:
            condition:
              lambda: 'return id(status_once_mode) == 2;' 
            then:
              switch.turn_on: delivery
            else:
              if:
                condition:
                  lambda: 'return id(status_once_mode) == 3;'
                then:
                  switch.turn_on: reject_call
- id: led_check
  then:
    - light.turn_off:
        id: led_action
    - light.turn_off:
        id: led_status
    - if:
        condition:
          lambda: 'return id(status_leding);'
        then:
        - if:
            condition:
              lambda: 'return id(status_mute);'
            then:
              light.turn_on:
                id: led_action
                effect: pulse
        - if:
            condition:
                lambda: 'return id(status_once_mode) > 0;'
            then:
              if:
                condition:
                  lambda: 'return id(status_once_mode) < 3;'
                then:
                  light.turn_on:
                    id: led_action
                    effect: blink
                else:
                  light.turn_on:
                    id: led_status
                    effect: blink
        - if:
            condition:
              lambda: 'return id(status_line);'
            then:
              light.turn_on:
                id: led_action
                effect: calling

# Accept incoming call
- id: accepting
  then:
    if:
      condition:
        lambda: 'return id(status_line);'
      then:
        - output.turn_on: relay_switch_line
        - output.turn_off: phone_down
        - lambda: 'id(line_status).publish_state("${line_status_answer}");'
        - delay: !lambda "return id(delay_before_answer).state;"
        - if:
            condition:
              switch.is_on: delivery
            then:
              lambda: ${play_delivery_access_allowed};
            else:
              if:
                condition:
                  lambda: 'return id(status_sound);'
                then:
                  lambda: ${play_user_access_allowed};                   
        - wait_until:
            lambda: 'return !isPlaying(audio_player);'
        - delay: $delay_before_open_door
        - output.turn_on: open_door
        - lambda: 'id(line_status).publish_state("${line_status_open}");'
        - delay: !lambda "return id(delay_open_time).state;"
        - output.turn_off: open_door
        - lambda: 'id(line_status).publish_state("${line_status_reject}");'
        - delay: !lambda "return id(delay_after_close).state;"
        - if:
            condition:
              lambda: 'return id(status_line);'
            then:
              output.turn_on: phone_down
        - lambda: 'id(line_status).publish_state("${line_status_close}");'
        - if:
            condition:
              switch.is_on: accept_call
            then:
              - switch.turn_off: accept_call
              - switch.turn_off: delivery

# Reject incoming call
- id: rejecting
  then:
    if:
      condition:
        lambda: 'return id(status_line);'
      then:
        - output.turn_on: relay_switch_line
        - output.turn_off: phone_down
        - lambda: 'id(line_status).publish_state("${line_status_answer}");'
        - delay: !lambda "return id(delay_before_answer).state;"
        - if:
            condition:
              lambda: 'return id(status_sound);'
            then:
              if:
                condition:
                  lambda: 'return id(current_mode) == 2;'
                then:
                  lambda: ${play_access_denied};                  
                else:
                  if:
                    condition:
                      switch.is_on: reject_call
                    then:
                      lambda: ${play_user_no_connect};                 
                    else:
                      lambda: ${play_user_no_answer};
        - wait_until:
            lambda: 'return !isPlaying(audio_player);'
        - delay: !lambda "return id(delay_open_time).state;"
        - lambda: 'id(line_status).publish_state("${line_status_reject}");'
        - if:
            condition:
              lambda: 'return id(status_line);'
            then:
              output.turn_on: phone_down
        - lambda: 'id(line_status).publish_state("${line_status_close}");'
        - delay: !lambda "return id(delay_after_close).state;"
        - if:
            condition:
              switch.is_on: reject_call
            then:
              switch.turn_off: reject_call

# Reject no answer
- id: rejecting_no_answer
  then:
    if:
      condition:
        lambda: 'return id(status_line);'
      then:
        - delay: $delay_no_answer
        - script.execute: rejecting

- id: state_call
  then:
    if:
      condition:
        switch.is_on: accept_call
      then:
        script.execute: accepting
      else:
        if:
          condition:
            switch.is_on: reject_call
          then:
            script.execute: rejecting
          else:
            if:
              condition:
                lambda: 'return id(current_mode) == 3;'
              then:
                script.execute: accepting
              else:
                if:
                  condition:
                    lambda: 'return id(current_mode) == 2;'
                  then:
                    script.execute: rejecting
                  else:
                    if:
                      condition:
                        lambda: 'return id(current_mode) == 1;'
                      then:
                        script.execute: rejecting_no_answer
                      else:
                        lambda: 'id(line_status).publish_state("${line_status_close}");'


number:
- platform: ld2410
  timeout:
    name: timeout
  light_threshold:
    name: light threshold
  max_move_distance_gate:
    name: max move distance gate
  max_still_distance_gate:
    name: max still distance gate
  g0:
    move_threshold:
      name: g0 move threshold
    still_threshold:
      name: g0 still threshold
  g1:
    move_threshold:
      name: g1 move threshold
    still_threshold:
      name: g1 still threshold
  g2:
    move_threshold:
      name: g2 move threshold
    still_threshold:
      name: g2 still threshold
  g3:
    move_threshold:
      name: g3 move threshold
    still_threshold:
      name: g3 still threshold
  g4:
    move_threshold:
      name: g4 move threshold
    still_threshold:
      name: g4 still threshold
  g5:
    move_threshold:
      name: g5 move threshold
    still_threshold:
      name: g5 still threshold
  g6:
    move_threshold:
      name: g6 move threshold
    still_threshold:
      name: g6 still threshold
  g7:
    move_threshold:
      name: g7 move threshold
    still_threshold:
      name: g7 still threshold
  g8:
    move_threshold:
      name: g8 move threshold
    still_threshold:
      name: g8 still threshold
- platform: template
  name: ${dev_name}_before_answer
  icon: "mdi:clock"
  id: delay_before_answer
  optimistic: true
  mode: box
  unit_of_measurement: "мс"
  entity_category: "config"
  restore_value: true
  initial_value: 1000
  min_value: 100
  max_value: 5000
  step: 100
- platform: template
  name: ${dev_name}_open_time
  icon: "mdi:clock"
  id: delay_open_time
  optimistic: true
  mode: box
  unit_of_measurement: "мс"
  entity_category: "config"
  restore_value: true
  initial_value: 600
  min_value: 100
  max_value: 2000
  step: 50
- platform: template
  name: ${dev_name}_after_close
  icon: "mdi:clock"
  id: delay_after_close
  optimistic: true
  mode: box
  unit_of_measurement: "мс"
  entity_category: "config"
  restore_value: true
  initial_value: 2000
  min_value: 100
  max_value: 5000
  step: 100

select:
- platform: ld2410
  distance_resolution:
    name: "distance resolution"
  baud_rate:
    name: "baud rate"
  light_function:
    name: light function
  out_pin_level:
    name: out pin level 
- platform: template
  name: ${dev_name}_modes
  icon: "mdi:deskphone"
  optimistic: true
  id: mode_select
  options:
    - ${input_select_disable}
    - ${input_select_no_answer}
    - ${input_select_reject}
    - ${input_select_accept}
  initial_option: ${input_select_disable}
  on_value:
    lambda: |-
        if (id(mode_select).state == "${input_select_disable}") {
          id(current_mode) = 0;
        } else if (id(mode_select).state == "${input_select_no_answer}") {
          id(current_mode) = 1;
        } else if (id(mode_select).state == "${input_select_reject}") {
          id(current_mode) = 2;
        } else {
          id(current_mode) = 3;
        }
        
text_sensor:
- platform: template
  id: line_status
  icon: "mdi:bell"
  name: ${dev_name}_line_status
  lambda: 'return {"${line_status_close}"};'
- platform: wifi_info
  ip_address:
    name: ${dev_name}_ip
    icon: "mdi:lan"
  ssid:
    name: ${dev_name}_ssid
    icon: "mdi:wifi"
  mac_address:
    name: ${dev_name}_mac
    icon: "mdi:lan"
- platform: custom
  lambda: |-
    auto fs_info_sensor_ = new FSInfoSensor();
    App.register_component(fs_info_sensor_);
    return {fs_info_sensor_->firmware_current_version, fs_info_sensor_->fs_info_sensor};
  text_sensors:
    - name: ${dev_name}_firmware
      icon: "mdi:information"
      entity_category: diagnostic
    - name: ${dev_name}_fs_used
      icon: "mdi:micro-sd"
      entity_category: diagnostic


sensor:
- platform: ld2410
  light:
    name: light
  moving_distance:
    name : Moving Distance
  still_distance:
    name: Still Distance
  moving_energy:
    name: Move Energy
  still_energy:
    name: Still Energy
  detection_distance:
    name: Detection Distance
  g0:
    move_energy:
      name: g0 move energy
    still_energy:
      name: g0 still energy
  g1:
    move_energy:
      name: g1 move energy
    still_energy:
      name: g1 still energy
  g2:
    move_energy:
      name: g2 move energy
    still_energy:
      name: g2 still energy
  g3:
    move_energy:
      name: g3 move energy
    still_energy:
      name: g3 still energy
  g4:
    move_energy:
      name: g4 move energy
    still_energy:
      name: g4 still energy
  g5:
    move_energy:
      name: g5 move energy
    still_energy:
      name: g5 still energy
  g6:
    move_energy:
      name: g6 move energy
    still_energy:
      name: g6 still energy
  g7:
    move_energy:
      name: g7 move energy
    still_energy:
      name: g7 still energy
  g8:
    move_energy:
      name: g8 move energy
    still_energy:
      name: g8 still energy
- platform: wifi_signal
  name: ${dev_name}_rssi
  update_interval: 600s
  
binary_sensor:
- platform: ld2410
  has_target:
    name: Presence
  has_moving_target:
    name: Moving Target
  has_still_target:
    name: Still Target
  out_pin_presence_status:
    name: out pin presence status
- platform: gpio
  id: line_detect
  name: ${dev_name}_line_detect
  pin:
    number: $detect_line
    mode: INPUT_PULLUP
    inverted: True
  filters:
    - delayed_off: ${call_end_detect_delay}
  on_press:
    if:
      condition:
        lambda: 'return id(status_line) == false;'
      then:
        - lambda: 'id(status_line) = true;'
        - script.execute: led_check
        - logger.log: "Incoming call detected"
        - if:
            condition:
              lambda: 'return id(status_mute);'
            then:
              - output.turn_on: phone_down
              - output.turn_on: relay_switch_line
        - delay: !lambda "return id(delay_before_answer).state;"
        - script.execute: state_call
  on_release:
    - if:
        condition:
          switch.is_on: phone_disable
        then:
          - output.turn_on: phone_down
          - output.turn_on: relay_switch_line
        else:
          - output.turn_off: phone_down
          - output.turn_off: relay_switch_line
    - lambda: 'id(status_line) = false;'
    - logger.log: "Incoming call completed"
    - script.execute: led_check
  on_state:
    lambda: |-
      if (x) {
        id(line_status).publish_state("${line_status_call}");
      } else {
        id(line_status).publish_state("${line_status_close}");
      }   
      
- platform: gpio
  id: ${dev_name}_button
  pin:
    number: $button_boot
    mode: INPUT_PULLUP
    inverted: True
  on_press:
    then:
      switch.toggle: accept_call
  on_multi_click:
    - timing:
      - ON for at least 5s
      then:
        lambda: |-
          ESP_LOGW("DMF", "Erase settings and restart...");
          wifi::global_wifi_component->save_wifi_sta("-----", "");
          delay(500);
          ESP.restart();

- platform: gpio
  id: ${dev_name}_external_button
  name: ${dev_name}_external_button
  pin:
    number: $button_ring
    mode: INPUT_PULLUP
    inverted: True

output:
- platform: gpio
  id: relay_switch_line
  pin:
    number: $relay_line
    mode: OUTPUT
- platform: gpio
  id: open_door
  pin:
    number: $switch_open
    mode: OUTPUT
- platform: esp8266_pwm
  id: indicator
  pin:
    number: $led_indicator
    mode: OUTPUT
- platform: gpio
  id: phone_down
  pin:
    number: $switch_phone
    mode: OUTPUT

button:
- platform: ld2410
  factory_reset:
    name: "factory reset"
  restart:
    name: "restart"
  query_params:
    name: query params
- platform: restart
  name: ${dev_name}_restart
- platform: template
  name: ${dev_name}_save
  id: save
  icon: "mdi:content-save-cog"
  entity_category: "config"
  on_press:
    - lambda: 'global_preferences->sync();'
- platform: template
  name: ${dev_name}_update
  icon: "mdi:arrow-up-bold-circle"
  entity_category: "diagnostic"
  on_press:
    - lambda: 'startUpdate(updater);'  

switch:
- platform: ld2410
  engineering_mode:
    name: "engineering mode"
  bluetooth:
    name: "control bluetooth"
- platform: template
  name: ${dev_name}_delivery
  id: delivery
  icon: "mdi:package"
  turn_on_action:
    - switch.template.publish:
        id: delivery
        state: true
    - switch.turn_on: accept_call
  turn_off_action:
    - switch.template.publish:
        id: delivery
        state: false
    - if:
        condition:
          switch.is_on: accept_call
        then:
          lambda: 'id(status_once_mode) = 1;'
        else:
          lambda: 'id(status_once_mode) = 0;'
    - script.execute: led_check
        

- platform: template
  name: ${dev_name}_accept_call
  id: accept_call
  icon: "mdi:door-open"
  turn_on_action:
    - switch.template.publish:
        id: accept_call
        state: true
    - switch.turn_off: reject_call
    - logger.log: "Accept call switch is ON"
    - if:
        condition:
          switch.is_on: delivery
        then:
          lambda: 'id(status_once_mode) = 2;'
        else: 
          lambda: 'id(status_once_mode) = 1;'
    - script.execute: led_check
    - if:
        condition:
          lambda: 'return id(status_line);'
        then:
          - logger.log: "Execute action script"
          - script.execute: state_call
        else:
          - logger.log: "No incoming call. One-time mode is set."
  turn_off_action:
    - switch.template.publish:
        id: accept_call
        state: false
    - switch.turn_off: delivery
    - lambda: 'id(status_once_mode) = 0;'
    - script.execute: led_check

  
- platform: template
  name: ${dev_name}_reject_call
  id: reject_call
  icon: "mdi:phone-hangup"
  turn_on_action:
    - switch.template.publish:
        id: reject_call
        state: true
    - switch.turn_off: accept_call
    - switch.turn_off: delivery
    - lambda: 'id(status_once_mode) = 3;'
    - script.execute: led_check
    - if:
        condition:
          lambda: 'return id(status_line);'
        then:
          - logger.log: "Execute action script"   
          - script.execute: state_call
        else:
          - logger.log: "No incoming call. One-time mode is set."
  turn_off_action:
    - switch.template.publish:
        id: reject_call
        state: false
    - lambda: 'id(status_once_mode) = 0;'
    - script.execute: led_check

- platform: template
  name: ${dev_name}_mute
  id: mute
  icon: "mdi:bell-off"
  entity_category: "config"
  turn_on_action:
    - switch.template.publish:
        id: mute
        state: true
    - lambda: 'id(status_mute) = true;'
    - script.execute: led_check
  turn_off_action:
    - switch.template.publish:
        id: mute
        state: false
    - lambda: 'id(status_mute) = false;'
    - script.execute: led_check
            
- platform: template
  name: ${dev_name}_phone_disable
  id: phone_disable
  icon: "mdi:phone-off"
  entity_category: "config"
  turn_on_action:
    - switch.template.publish:
        id: phone_disable
        state: true
    - lambda: 'id(status_phone_disable) = true;'
    - if:
        condition:
          lambda: 'return id(status_line) == false;'
        then:
          - output.turn_on: phone_down
          - output.turn_on: relay_switch_line
  turn_off_action:
    - switch.template.publish:
        id: phone_disable
        state: false
    - lambda: 'id(status_phone_disable) = false;'
    - if:
        condition:
          lambda: 'return id(status_line) == false;'
        then:
          - output.turn_off: phone_down
          - output.turn_off: relay_switch_line   
          
- platform: template
  name: ${dev_name}_led
  id: led
  icon: "mdi:led-on"
  entity_category: "config"
  turn_on_action:
    - switch.template.publish:
        id: led
        state: true
    - lambda: 'id(status_leding) = true;'
    - script.execute: led_check
  turn_off_action:
    - switch.template.publish:
        id: led
        state: false
    - lambda: 'id(status_leding) = false;'
    - script.execute: led_check

- platform: template
  name: ${dev_name}_sound
  id: sound
  icon: "mdi:volume-high"
  entity_category: "config"
  turn_on_action:
    - switch.template.publish:
        id: sound
        state: true
    - lambda: 'id(status_sound) = true;'
  turn_off_action:
    - switch.template.publish:
        id: sound
        state: false
    - lambda: 'id(status_sound) = false;'

к стандартному конфигу добавил UART
uart:
id: uart10
tx_pin: GPIO16
rx_pin: GPIO2
baud_rate: 256000
stop_bits: 1
поддержку сенсора ld2410
подпаялся к этим ножкам и залил прошивку. После этого устройство отвалилось из сети. Залить по воздуху невозможно - HA его не видит. По кабелю COM порт не появлсяется.
само устройство в сети, по IP напрямую не открывается
image

как восстановить?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.