scrators / smartintercom Goto Github PK
View Code? Open in Web Editor NEWУмный домофон на ESP
License: GNU Affero General Public License v3.0
Умный домофон на ESP
License: GNU Affero General Public License v3.0
Так как предыдущая версия автоматизации малость устарела, то новая - рабочая.
Создаем файл с именем "telegram_smartintercom.yaml" и в него записываем следующий ниже код.
В принципе файл может иметь и другое имя.
Если все автоматизации у вас в одном файле указанном в настройке "automation: !include automations.yaml", то самую первую строку кода "automation:" удалить.
Первая автоматизация "- id: 'telegram_smartintercom'" используется только если вам нужно вызвать меню домофона напрямую командой "/smartintercom". Если нет, то тоже можно удалить.
Вторая автоматизация "- id: 'telegram_smartintercom_callback'" используется, если вызов идет непосредственно из меню верхнего уровня.
Две строки меню в обеих автоматизациях:
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
Будут какие-то вопросы - задавайте. По мере возможности отвечу и помогу.
Нужно удалить пробелы, чтобы было так [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:
ДД. Ничего не знаю об устройстве аналоговых домофонов, но в порядке бреда, возможно ли реализовать вход по заданному коду. Код проверять по тональному сигналу.
Создадим автоматизацию.
Создайте например файлик с таким именем 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
Так как умный дом Яндекс имеет свои ограничения, то пришлось немного поизвращаться и... ну как получилось, так получилось.
Но работает без проблем!
Примечание:
У меня домофон назван как "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.
После этого идем в установленный на смарте "Умный дом с Алисой" и там добавляем новое устройство.
Пользуемся!
Рекомендую посмотреть какие команды надо озвучивать Алисе для правильной работы.
Команда "Открыть домофон" - открывает его на один раз. Соответственно наоборот "Закрыть домофон" - отключает однократное открытие.
Команда "Выключить звук на домофоне" - отключает произношение фразы и наоборот - "Включить звук на домофоне"
Можно менять режим фразами:
"Домофон установить режим" или "Домофон установить программу":
"нормальный" - Не активен
"тихий/тихо" - Сброс вызова (тут вопрос к яндексу - слово "тихий" срабатывает не всегда)
"авто" - Открывать всегда
"Включить/выключить подсветку на домофоне" - тут и так понятно, да и не особо-то и нужно.
Добрый день!
Кнопки с дашборда HA перестали адекватно нажиматься и менять статус
Курьеру звук не воспроизводится
Нет статуса Открытие двери
По FTP файлы видны, но скачать их нельзя
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 нажимал, но не помогает
Здравствуйте! Можно ли заюзать на платке с ESP8266 GPIO1 и GPIO3, подпаятся к ним? хочу с датчиком приближения совместить HLK-LD2410? потянет?
Можно ли узнать функции данного устройства? Так же хотелось бы увидеть хотя бы краткое видео устройства в работе. И для людей не использующих НА была бы очень полезна поддержка mqtt, тогда мы могли бы использовать это чудо устройство с другими умными домами. Я могу подключить это чудо устройство к аналоговому домофону?
Умный Дом Яндекс, как я писал в прошлом подключении управления через Алису, накладывает некоторые ограничения на функционал. Ну и поступила жалоба, что в предыдущих настройках при выключенной функции "Однократного открытия домофона" в программе "Умный дом с Алисой" все переключатели заблокированы. Голосом они управляются, а вот в программе нет.
Будем избавляться от этого недостатка...
Примечание: создание настроек описано с нуля
Для управления домофоном при помощи Умного дома Яндекс должна быть установлена и настроена интеграция 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.
После этого идем в установленный на смарте "Умный дом с Алисой" и там добавляем новое устройство. Если было сделано по предыдущему руководству, то предварительно удаляем старое устройство.
Пользуемся! Все функции управления черед программу разблокированы всегда.
Теперь по поводу команд!
Вместо команды "Открыть/Закрыть домофон", придется говорить "Разблокировать домофон" и соответственно "Заблокировать домофон". Остальные команды не претерпели никаких изменений.
Тестировалось на плате 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"
Также не забываем отключить API-компонент ESPHome (120 строчка):
#api:
Далее в соответствии с инструкцией добавляем шаблон SCHome_Smartintercom_v2.5.json в Sprut.hub.
После перезагрузки MQTT-контроллера в Sprut.hub у вас появится устройство «Домофон».
Для управления умным домом и его устройствами через Телеграм, требуется создание своего бота.
Вот этим мы и займемся...
В поиске ищем @Во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 автоматизации и таймеры и склероз побежден. :))
Добрый день! залили такой
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 напрямую не открывается
как восстановить?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.