Блог

Кейс "Гаражные ворота".

Давно уже был сделан интегрированный в Home Assistant свич для открытия - закрытия гаражных ворот. А для отслеживания положения гаражных ворот я использую два дверных сенсора для крайних положений. Чтобы избежать лишних вопросов, сразу покажу, как это сделано у меня. В качестве "стартера" для мотора я использую связку из sonoff mini switch.sonoff_1000a01e4a и обычного электромагнитного реле на 220, которое уже и замыкает контакты (без напруги). Кнопка открытия гаража, которая раньше подключалась непосредственно к мотору теперь подключена на контакты выключателя в sonoff. Таким образом, offline и online манипуляции с воротами полностью синхронизированы. Можно было замутить что нибудь на ESP. Но мой принцип "Чем проще - тем проще". Ну и пара сяомишных дверных датчиков для определения, что ворота полностью открыты или закрыты. binary_sensor.openclose_22 (на закрытие) и binary_sensor.openclose_21 (на открытие)

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

Итак, нам нужно знать движутся ворота или остановлены, а так же отслеживать направление движения. Создаем два input_boolean для отслеживания этих состояний

garage_door_motion: name: Гаражные ворота движение # ON движение OFF остановка icon: mdi:garage-alert garage_door_direction: name: Гаражные ворота направление # ON вверх OFF вниз icon: mdi:sign-direction

Кроме этого неплохо бы знать насколько ворота открыты. Т.е. иметь возможность следить за их положением в реальном времени. Для это был создан счетчик counter:

garage_counter: initial: 0 step: 1

Я засек, что полностью ворота открываются за 21 секунду. Это в дальнейшем нам тоже пригодится.

Теперь переходим к практической части.

Так выглядит script запускающий механизм гаражных ворот. Тут все просто. Включаем наш свич sonoff. Ток подается на реле, которое замыкает контакты. Процесс пошел. Через секунду свич выключается. Реле размыкается. Но мотор продолжает работать до следующей команды или до достижения механизмом одного из крайних положений. Все просто.

garagescript: alias: garagescript sequence: - service: switch.turn_on entity_id: switch.sonoff_1000a01e4a - delay: seconds: 1 - service: switch.turn_off entity_id: switch.sonoff_1000a01e4a - service: homeassistant.update_entity entity_id: sensor.garage_open_close

Теперь нам нужно будет сделать несколько скриптов. Для уменьшения значений счетчика, для увеличения значений счетчика, для переключения смены направления и небольшой скрипт-заглушка (пригодится)

garage_counter_decrement: alias: counter decrement sequence: - service: counter.decrement data: entity_id: counter.garage_counter garage_counter_increment: alias: counter increment sequence: - service: counter.increment data: entity_id: counter.garage_counter garage_door_direction: alias: garage door direction sequence: - service: input_boolean.toggle data: entity_id: input_boolean.garage_door_direction noop: alias: Заглушка sequence: - delay: seconds: 0.1

Переходим к автоматизациям. Сначала нужно сделать пару калибровочных автоматизаций, чтобы наши переменные принимали правильное значение при крайних точках гаражных ворот. Всякое может случиться... И если что то собьется в процессе, то при полном открытии или закрытие ворот все снова будет в норме.

- alias: калибровка закрыты trigger: platform: state entity_id: binary_sensor.openclose_22 from: 'on' to: 'off' action: - service: input_boolean.turn_off entity_id: input_boolean.garage_door_motion - service: input_boolean.turn_on entity_id: input_boolean.garage_door_direction - service: counter.reset data: entity_id: counter.garage_counter - alias: калибровка открыты trigger: platform: state entity_id: binary_sensor.openclose_21 from: 'on' to: 'off' action: - service: input_boolean.turn_off entity_id: input_boolean.garage_door_motion - service: input_boolean.turn_off entity_id: input_boolean.garage_door_direction - service: counter.configure data: entity_id: counter.garage_counter value: 21

Ну а теперь две главные автоматизации. Первая меняет input_boolean на нужные значения. Триггером является включение свича sonoff (а значит запуск привода гаражных ворот). Вторая будет работать со счетчиком. Сразу говорю, что это для меня было самым простым решением. Но у него есть подводные камни. А именно: автоматизация запускается раз в секунду. А следовательно, если сразу не добавить ее в исключения в history, logbook, recorder и вообще везде, то она вам загадит базу. Так, что не забываем это сделать.

- alias: Смена направления trigger: platform: state entity_id: switch.sonoff_1000a01e4a from: 'off' to: 'on' action: - service: input_boolean.toggle entity_id: input_boolean.garage_door_motion - service_template: > {% if is_state('input_boolean.garage_door_motion','off') and is_state('binary_sensor.openclose_21','on') and is_state('binary_sensor.openclose_21','on') %} script.garage_door_direction {% else %} script.noop {% endif %} - alias: Garage door couter trigger: platform: time_pattern seconds: "/1" action: - service_template: > {% if is_state('input_boolean.garage_door_motion','on') and is_state('input_boolean.garage_door_direction','on') %} script.garage_counter_increment {% elif is_state('input_boolean.garage_door_motion','on') and is_state('input_boolean.garage_door_direction','off') %} script.garage_counter_decrement {% else %} script.noop {% endif %}

На этом собственно вся подготовка завершена. Теперь нам нужен только template sensor в котором все наши переменные мы и соберем:

- platform: template sensors: garage_open_close: friendly_name_template: >- {% if is_state('binary_sensor.openclose_22', 'off') and is_state('binary_sensor.openclose_21', 'on') %} Гараж закрыт {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'off') %} Гараж открыт {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and is_state('input_boolean.garage_door_motion', 'off') %} Ворота остановлены {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and is_state('input_boolean.garage_door_motion', 'on') and is_state('input_boolean.garage_door_direction', 'on') %} Ворота открываются {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and is_state('input_boolean.garage_door_motion', 'on') and is_state('input_boolean.garage_door_direction', 'off') %} Ворота закрываются {% else %} {% endif %} value_template: "{{ states('counter.garage_counter') }}" unit_of_measurement: '' entity_picture_template: >- {% set count = states('counter.garage_counter')|int %} {% if is_state('binary_sensor.openclose_22', 'off') %} /local/icons/garage/garage_00.png {% elif is_state('binary_sensor.openclose_21', 'off') %} /local/icons/garage/garage_20.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count < 3 %} /local/icons/garage/garage_02.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 2 and count < 5 %} /local/icons/garage/garage_04.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 4 and count < 7 %} /local/icons/garage/garage_06.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 6 and count < 9 %} /local/icons/garage/garage_08.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 8 and count < 11 %} /local/icons/garage/garage_10.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 10 and count < 13 %} /local/icons/garage/garage_12.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 12 and count < 15 %} /local/icons/garage/garage_14.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 14 and count < 17 %} /local/icons/garage/garage_16.png {% elif is_state('binary_sensor.openclose_22', 'on') and is_state('binary_sensor.openclose_21', 'on') and count > 16 %} /local/icons/garage/garage_18.png {% else %} {% endif %}

Для того, чтобы все это можно было увидеть в Lovelace нужно будет использовать кастомную карту button-card. К сожалению стандартная entity button не поддерживает images в визуализации. Только иконки.

cards: - type: "custom:button-card" entity: sensor.garage_open_close show_entity_picture: true tap_action: action: call-service service: script.turn_on service_data: entity_id: script.garagescript

Ну и как все это выглядит:

Ну и в качестве бонуса ссылка на картинки в формате png которые я использовал для сенсора:

garage.zip


Огонь. Круто. Молодец. 

У ліфмастера наверняка есть внутри uart порт куда он шлет данные о состоянии, будет круче  их считывать и интерпритировать


Даже не думал об этом. Можно посмотреть

Вы используете дома дисплей какой-нибудь? Какой? Данная карта ведь поддерживается только в ХА, а в альтернативных системах (хомеХабит) полученного эффекта не добиться.

Скорее всего это только для официальных апп. У меня нет экрана. Всё с телефона

Гараж не отапливаемый?  Что будет зимой с батарейкой в датчике?

Ну карта термостата должна же о чем-то говорить? Год в работе, а все ещё 100%



Здравствуйте.


Осуществление очень понравилось, но налетел на грабли...


Распаковал картинки карточки из архива, но создать каталог "icons" в /config оказалось не возможно.
В Samba возвращает ошибку "Элемент не найден", то-же самое при копировании уже готовой папки с вложенными файлами.


При создании папки из встроенного редактора папка создаётся, но в Samba она не видна.


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


При движении и остановке ворот пути обновляются, но открыть эти PNG файлы карточка не может.


Подскажите пожалуйста: В чём может быть проблема?


Во первых, папка Icons должна быть не в корне папки config, а в папке www, для того, чтобы к иконкам был доступ извне. В моем случае это config/www/Icons/garage... Этот путь и указан в файлах. Только в них вместо www прописано "local" 

local/icons/garage/garage_14.png (из примера)

я не знаю, почему самба не даёт доступа у вас. Ну попробуйте создать и забросить через File manager. Дольше, но должно сработать :)




Спасибо. Это всё проклятая невнимательность. Карточка открыла PNG.

Но вот создать Папку ICONS не удалось ни в одном каталоге в т.ч. WWW. Пусть будет ICON - не суть.

Ещё раз спасибо!!!


Вернуться назад
Вернуться назад