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

24 июня 2020, 16:56

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

1600x_image.png?1593014678
1600x_image.png?1593014678
1600x_image.png?1593014677

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

Итак, нам нужно знать движутся ворота или остановлены, а так же отслеживать направление движения. Создаем два 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


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @Soprut

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. (em4d)
    (em4d) 14 дней назад

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

  2. (iot.sambir)
    (iot.sambir) 14 дней назад

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


  3. (ArtemSea)
    (ArtemSea) 12 дней назад

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

    • Stephan Fonderat (Fonderat)
      Stephan Fonderat (Fonderat) 12 дней назад

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

  4. Максим Кузин (XYLUG@H)
    Максим Кузин (XYLUG@H) 10 дней назад

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

    • Stephan Fonderat (Fonderat)
      Stephan Fonderat (Fonderat) 10 дней назад

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

К списку блогов

Тематические чаты

Похожие записи

05 февраля 2019, 00:29
Строю свой первый дом и рассказываю о муках выбора, проводке под умный дом, оборудовании. 05.09.2019 - лето
19 августа 2019, 20:21
Сервис для изготовления удобной маркировки в электрический щиток
13 февраля 2019, 22:00
Подключение радио на Xiaomi Gateway к Home Assistant c дальнейшим использованием в автоматизациях
19 апреля 2019, 20:53
Требуется ваше мнение!
06 февраля 2019, 12:02
Автоматизированное открытие/закрытие окна
04 апреля 2019, 12:45
Самое важное из апдейта Home Assistant 0.91-0.91.4 от 03.04.19.
21 марта 2019, 11:59
Самое важное из апдейта Home Assistant 0.9 от 20.03.19.
21 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.88 от 20.02.19.
19 января 2019, 20:49
Делюсь новостями по проекту.