Переключатель света на EspEasy в Home Assistant

Пришло время переводить выключатели на ESPEasy в Home Assistant

Что имеем:

  • Home Assistant 0.70
  • Esp прошитый ESPEasy Mega
  • Реле
  • Переключатель

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

Подключаем ESP с прошивкой ESPEasy к реле следующим образом:

ESP пин 3v3 к VCC реле
ESP пин GND к GND реле
ESP пин D6 (Gpio-12)  к IN реле

В ESPEasy создаем переключатель Switch input — Switch для реле во вкладке Devices.

Приводим его к следующему виду:

Имя: relay
Enabled: — галочка
Internal PullUp: — галочка
Inversed Logic: — пусто
1st GPIO: GPIO-12 (D6)
Switch Type: Switch
Switch Button Type: Normal Switch
Send Boot state: — галочка
Send to Controller: — пусто
IDX: — номер Dummy переключателя в Domoticz (если активно Send to Controller)
Values Name: state

Сохраняем.

Управляется реле командой (192.168.0.23 это адрес ESPEasy):

Включить: http://192.168.0.23/control?cmd=GPIO,12,0 
Выключить: http://192.168.0.23/control?cmd=GPIO,12,1 

Включаем нулем если реле сделали нормально закрытым, и единицей, если нормально открытым

Выполнив переходы в браузере, реле сработает и выдаст ответ:

{ "log": "GPIO 12 Set to 0", "plugin": 1, "pin": 12, "mode": "output", "state": 0 }

или

{ "log": "GPIO 12 Set to 0", "plugin": 1, "pin": 12, "mode": "output", "state": 1 }

Мы будем управлять через MQTT.

Для этого переходив во вкладку Controllers и добавляем первым контроллером OpenHUB MQTT. Прописываем адрес брокера, порт и не меняя остальные настройки сохраняем.

Теперь создаем переключатель Switch input — Switch для переключателя во вкладке Devices:

Имя: button
Enabled: — галочка
Internal PullUp: — галочка
Inversed Logic: — пусто
1st GPIO: GPIO-14 (D5)
Switch Type: Switch
Switch Button Type: Normal Switch
Send Boot state: — пусто (если активировать, то при загрузке esp синхронизирует реле с выключателем: если был свет включен, то при загрузке тоже будет включен)
Send to Controller: — пусто
Values Name: state

Сохраняем.

Подключим обычный (любой) переключатель света:
от ESP пин GPIO-14 (D5 на NodeMCU) в разрыв переключателя и на GND ESP:

Включаем Rules в Tools> Advanced

Переходим на вкладку Rules и вставляем туда следующее:

//Изменение состояния реле переключателем
on button#state do
  if [button#state]=0
    gpio,12,0
      else
    gpio,12,1
      endif
endon

 

Теперь при физическом нажатии переключателя, будет меняться статус реле — включаться и выключаться.

В Home Assistant переходим в switches.yaml и добавляем следующее:

####################################################
#                   Выключатели                    #
####################################################
# Выключатель, спальня
- platform: mqtt
  name: bedroom_switch
  state_topic: "/esp_switch_bedroom/relay/state"
  command_topic: "/esp_switch_bedroom/gpio/12"
  payload_on: "0"
  payload_off: "1"
  qos: 1
  retain: true


Пояснения:
ESPEasy публикует и слушает данные в MQTT следующим образом:
/esp_switch_bedroom/gpio/12
esp_switch_bedroom — это название нашей esp, заданное во вкладке Main
gpio/12 — тут все ясно
и отправив 1 или 0 мы включим или выключим реле на ESPEasy

Статус:
/esp_switch_bedroom/relay/state


Так как мы русскоговорящие, названия устройств в Home Assistans нам хочется видеть тоже на русском. Но name: bedroom_switch обязательно должно быть на английском, так как от этого имени формируется название устройства в Dev, и именно это название из dev мы будем распределять по группам в будущем (- switch.bedroom_switch)

Если же поставить name: Выключатель, то в dev он примет вид  switch.__

Он будет работать, но ровно до тех пор, пока мы не решим добавить еще один выключатель, так как он получит точно же такое имя switch.__


 

Весь этот набор отлично вмещается в глубокие подрозетники

 

Поделитесь с друзьями

комментарий 81

  1. >state_topic: «/esp_switch_bedroom/relay/state»
    >command_topic: «/esp_switch_bedroom/gpio/12»
    >payload_on: «0»
    > payload_off: «1»
    Такой вариант не работает в последних версиях espeasy mega. Теперь статус выдается только json’ом причем не совместимым с компонентом MQTT JSON Light.
    — platform: mqtt_template
    command_topic: «coil-kitchen/cmd»
    state_topic: «coil-kitchen/status»
    command_on_template: «gpio,13,1»
    command_off_template: «gpio,13,0»
    state_template: >
    {% if value_json.state == 1 and value_json.pin == 13 %}
    on
    {% if value_json.state == 0 and value_json.pin == 13 %}
    off
    {% endif %}

    • Спасибо, хотел на днях обновить прошивку на выключателях, теперь буду в курсе)

      • Здравствуйте! Сеществует ли у вас на сегодня связка espeasy и homeassistant? Можете показать пример сбора статусов gpio для актуальных версий? HA ругается на command_topic

        • Здравствуйте, сейчас пользуюсь ESPHome, подсказать не могу. Про mqtt почитайте на сайте ha, там будут расписаны все параметры mqtt сенсора

          • Да вот я тоже думаю не присмотреться ли к esphome, спасибо за быстрый ответ!

          • Да не за что) Тем более я в комментариях указывал конфиг esphome для связки из этого поста, там ничего сложного

    • Здравствуйте. Второй день пытаюсь разобраться с топиками.
      Условия: подключить ESPEasy к бесплатному стороннему MQTT серверу mqtt.4api.ru
      Сервер просит создавать топики так user_854ad62/cmd где user_854ad62 я изменить не могу.
      Что делаю: Создаю топик user_854ad62/cmd
      в настройках ESPEasy прописываюName: user_854ad62, OpenHub, srv1.mqtt.4api.ru, логин, пароль.
      при этом в терминале наблюдаю «Subscribed to: user_854ad62»
      В конфиге ESPEasy Tools-Advens по умолчанию Subscribe Template: /%sysname%/# пробовал менять на /%sysname%/ и %sysname% и %sysname%/ как вообще правильно?
      Publish Template:/%sysname%/%tskname%/%valname%
      В топик шлю: gpio,2,0
      Не работает
      контроль поступления команд контролирую приложением клиентом на телефоне (команді приходят)
      Также создан топик user_854ad62/gpio/2 куда шлю «0». Не работает.

      строка из браузера http://192.168.0.104/control?cmd=GPIO,2,0 включает светодиод нормально.

    • Можно использовать бп с али, например, вот такой: http://ali.pub/32kw16
      Или разобрать обычный бп от телефона. В глубоком подрозетнике все помещается)

    • Это адрес и порт вашего брокера. Если поставить дополнение Mosquito в hassio, то это адрес вашего ha, порт у Mosquito обычно 1883

        • Здравствуйте уважаемый kvv. Через интернет и физической кнопкой реле управляется. Теперь для меня самое сложное, как этим реле управлять из Home Asistent?
          Только начинаю постигать узы, не обессудьте. Спасибо.
          Да, в configuration.yaml вставил то, что вы указали.

          • Вообще советую приглядеться к ESPHome, у них связь с HA по api, без промежуточных узлов в виде mqtt брокера

  2. Случайно наткнулся на ваш блог, и уже второй день перечитываю)) Спасибо огромное за вашу работу!
    Если вас не затруднит, не подскажите, как в HA настроить работу switch c GPIO RPi как кнопку?
    Как вкл/выкл работает, а так, чтобы «нажал» и через пол секунды вернулось состояние не могу сделать ?
    Использую код:

    switch:
      - platform: rpi_gpio
        ports:
          11: Fan Office
    • Добрый день! Спасибо за Ваш отзыв)
      Я правильно понял, у вас на этом gpio висит реле? Если так, то можно без проблем сделать автоматизацию на изменение состояния после определенной задержки по времени, те же полсекунды. Сейчас набросаю код

    • Автоматизация выключает switch.you_switch если он переходит из состояния off в on после 500 миллисекунд задержки.

      - alias: 'name_of_automation'
        trigger:
        - platform: state
          entity_id: switch.you_switch
          from: 'off'
          to: 'on'
        action:
        - delay:
            milliseconds: 500
        - service: switch.turn_off
          data:
            entity_id: switch.you_switch
      
      • «Спасибо большое» кинул на кофе ))
        Читаю дальше ваш блог и учусь ))

      • Всё отлично работало, пока сегодня не обновил HA с предпоследней на последнюю версию…
        Теперь даже когда ставлю задержку 50 милисекунд, всё равно «держит» больше секунды.
        У меня это критично, спалю реле…
        Подскажите пожалуйста, где копать? Возможно что какая-то задержка при обработке? Вот мой конфиг:

        — alias: ‘knopka_svet_koridor’
        trigger:
        — platform: state
        entity_id: switch.koridor
        from: ‘off’
        to: ‘on’
        action:
        — delay:
        milliseconds: 50
        — service: switch.turn_off
        data:
        entity_id: switch.koridor
        — alias: ‘knopka_svet_spalnia’
        trigger:
        — platform: state
        entity_id: switch.spalnia
        from: ‘off’
        to: ‘on’
        action:
        — delay:
        milliseconds: 50
        — service: switch.turn_off
        data:
        entity_id: switch.spalnia

      • Может как-то можно объединить автоматизацию для двух свитчей в одну?

        • Какая у вас версия HA? У меня на 0.108.6 все отлично работает, сейчас проверил. Объединить автоматизацию для двух свитчей в одну можно, ниже код, тоже проверил, работает

  3. - alias: 'knopki_svet'
      trigger:
      - platform: state
        entity_id: 
          - switch.spalnia
          - switch.koridor
        from: 'off'
        to: 'on'
      action:
      - delay:
          milliseconds: 500
      - service: switch.turn_off
        data:
          entity_id: 
            - switch.spalnia
            - switch.koridor
    
    
    • Работать то работает, но ставлю 100мсек задержку, а держит больше секунды…
      Причем заметил, что из нескольких проб вкл/выкл бывает что отрабатывает задержку правильно.
      Может быть что HA как-то кэширует это?
      Home Assistant 0.108.6

      • Я у себя тестил с выключателями на esphome, всегда отрабатывают вовремя. А у вас через gpio, то есть вообще локально, долно все быть молниеносно. Советую открыть проблему на github HA (https://github.com/home-assistant/core/issues), с указанием того что вы мне писали (что до обновления все было нормально). Подробно все распишите

        • Стыдно признаться, но мой английский оставляет желать лучшего, так что описать проблему я грамотно не смогу.
          Да и честно говоря, я уже не уверен что «чисто» работало до обновления. Поскольку иногда и сейчас работает как нужно, а до обновления я особо не успел «потестить».
          Вообщем решил пока оставить как есть, планирую в ближайшее время переехать на с RPi на ноут с докер+ХА. Значит прямых GPIO всё равно не будет.
          Спасибо за участие и помощь!

          • Успехов в дальнейших начинаниях) все равно странно, что автоматизации не отрабатывали задержку как нужно..

          • возможно что не всегда отрабатывает как нужно, поскольку вся система грузится и работает на RPi3 не с SD карты, а с USB флешки. Поскольку там милисекунды, может запрос-ответ с флешки «съедает» это время? Или вся автоматизация в RAM уходит?

          • У меня ранее ha на usb ssd работал на pi3, как то даже не замечал, все быстро и без косяков, намного быстрее чем sd флешка. Если именно на usb флешке у вас, то они могут быть медленными, тогда все сходится.
            Вряд ли автоматизации будут в ram висеть.. хотя даже не задумывался об этом, надо почитать

          • А вообще, можно ли без автоматизаций создать кнопку, а не переключатель в ХА? Т.е. «замкнуто-пока-нажато»?

          • Встроенными средствами ha gpio? Я не нашел. На есп с прошивкой ESPHome все очень просто делается, добавив on_press к нужному binary_sensor. Советую вам взглянуть в сторону ESPHome)

          • Да, когда перенесу ХА с RPi на ноут, придётся.
            Но я сторонник принципа «подключение проводами лучше чем по воздуху». И если у меня роутер, сервер и исполняющие реле стоят рядом, то согласитесь, хотелось бы использовать это по максимуму.

          • Полностью согласен с вашим принципом, я придерживаюсь такого же мнения. Сейчас доделываю в спальне ремонт, провел к выключателю витую пару, хочу esp32 подключить через lan. И к этой же еспшке led контроллер для подсветки. И она же будет принимать данные с термометра от Xiaomi c e-ink экраном. Понравился он мне внешне) ну и проводной датчик co2 какой-нибудь

          • «хочу esp32 подключить через lan» — вот с этого места прошу по-подробнее )) Как?!

          • Да все никак руки не дойдут) модуль лежит, ждет своего часа))

          • Думаю часом там не отделаться ))
            С нетерпением буду ждать!

          • Здравствуйте!
            Приобрёл вот такой модуль LAN8720: https://aliexpress.ru/item/32828023330.html
            Пытаюсь подружить его с ESP32-WROOM-32U (https://aliexpress.ru/item/4000155919030.html) и чет совсем грустно.
            3.3в питание для LAN взял с платы ESP32
            Вот мой последний конфиг:

            esphome:
              name: esp32_zvon
              platform: ESP32
              board: esp32dev
            ethernet:
              type: LAN8720
              mdc_pin: GPIO23
              mdio_pin: GPIO18
              phy_addr: 1
              manual_ip:
                static_ip: 192.168.1.88
                gateway: 192.168.1.1
                subnet: 255.255.255.0
            # Enable logging
            logger:
            

            Не подскажите, куда копать?

          • Посмотрю какой у меня ethernet модуль, если такой же, то попробую подключить и напишу. Лежит уже полгода, никак руки не дойдут)

          • Извините что беспокою, ну как, не удалось подключить?
            Прям руки чешутся :))

          • Пока нет, в скором времени) самому интересно

          • Да, там 4 свободных gpio, 2 задействовано. Какую конфигурацию вы хотите реализовать? Что в итоге должно получиться?

          • Хотел в этот конфиг https://gist.github.com/frenck/0af30b05f7c98d17219548b46a03df21#file-doorbell-yaml добавить две on_press-кнопки на свободные GPIO. Но включил голову и понял что на 2 кнопки с релюхами, нужно не 2 свободных GPIO, а 4. Т.е. нужно уже NodeMCU.
            Т.е., теперь хочу в выше указанный конфиг, добавить две on_press-кнопки, каждая на своё реле, с учётом что будет модуль NodeMCU.
            По вашему совету, решил переходить с GPIO RPi, на ESPHome )

          • Вот поэтому я и спросил)) Конечно переходите, мне в ESPHome нравится, то, что задействован api. То есть мы без танцев с бубном всегда видим точный статус всех подключенных кнопок, реле и т.п.

          • Вот только пока въехать толком не получается. С ESP_easy как-то полегче…
            Если не затруднит, не могли бы вы подправить yaml (ссылка выше) на nodemcu и + добавить две on_press-кнопки, каждая на своё реле?

          • Там все просто. Чтобы прописать nodemcu, в качестве платы, нужно прописать board: nodemcuv2
            Чтобы добавить реле, в switch добавить данные по вашему, gpio. Тоже самое касается и кнопок — binary_sensor. В документации на esphome.io все подробно описано с примерами. Сейчас нет доступа к ПК, с конфигом пока не помогу. В разделе автоматизаций описаны on_press on_release команды. Если что, спрашивайте

          • Сделал ))
            Только не могу настроить автоматизацию для notify. Шлёт уведомления после каждого нажатия кнопки звонка. Как бы сделать так, чтобы после отправки уведомления о нажатии, задержка была мин 5? Вот конфиг notify:
            — alias: Test soobscheniy
            trigger:
            platform: state
            entity_id: binary_sensor.zvonok_button
            to: ‘on’
            action:
            service: notify.mobile_app_imoy
            data:
            message: Звонят возле лифта

          • Отлично)
            Если я правильно понял про задержку, то это делается простым добавлением delay, в примере для кнопки pi gpio он есть

          • Если правильно понимаю, то добавив delay для action, мы просто задерживаем отправку сообщения. А нужно чтобы только для повторного нажатия был delay.
            Суть в том, что когда кто-то жмёт кнопку дверного звонка, может жать по несколько раз, а уведомления достаточно одного.

          • Понял. На ум приходит создать таймер обратного отсчёта, например 5мин, и если он ещё идёт, то уведомление не отправится. Но это реализация отправки уведомления на первый звонок. Чтобы на второй, с ходу не соображу. Надо подумать

          • Может если, допустим, на первое нажатие начинается обратный таймер на 5 мин, уведомление не отправлено. Если в промежутке от 5 до 4 мин идёт повторное нажатие, то отсылается уведомление. Как-нибудь так..

          • Тогда наверное наоборот, на первое нажатие идёт отправка и начинается обратный отсчет, если в промежутке идут нажатия то отправки нет (через condition?), по прошествии заданного времени, возможна повторная отправка в случае нажатия. Вот только как это «расписать»?

          • Спасибо! К сожалению смогу проверить только через неделю. Сразу же отпишусь!

  4. Отличная статья! Всё доступно и легко реализуемо даже для таких начинающих «интеграторов» как я.
    Повторил — всё работает ))
    Прошивка ESP_easy — mega-20200410.
    Home Assistant 0.108.6
    Единственный косяк — релешки. Взял такие же, как на фото, не протянули и 10 кликов (нагрузка около 1А), «залипли». Было 2 шт. оба в топку. Поставил тоже китайские, но на черной плате и другого производителя. Пока работают.

    • Спасибо) та, что на фото, отработала полтора года и до сих пор живая, лежит в коробке) поменял все на готовый модуль из одного обзора (rr300w), так как сгорел БП.

      • Я ещё добавил сюда же DHT22, да и nodeMCU всё же даёт больше возможностей для расширения этой поделки чем rr300w. Опять же, если сгорит бп в rr300, то гемор с его заменой в отличии от раздельного исполнения. Хотя по компактности конечно проигрывает.

        • Поправляю себя, в rr300w нет БП. Так что он в любом случае хуже чем связка NodeMCU+БП ))

        • В случае готового модуля его проще запихнуть в подрозетник, а так конечно, nodemcu это тема. Особенно если с esp32)
          кстати в rr300w источник питания на 3.3 в (или на 5в?) распаян на плате. И да, если он сгорит это будет тот ещё гемор его сделать.

          • Не имею сего девайса, но учитывая что питание 5в, значит понижает до 3,3 ну и 5в, наверное, на реле.

  5. Спасибо .
    Ваша статья сдвинула с мертвой точки.
    Бился с подключением топика ( MQTT брокера) к переключателю на Home Assistant.
    У вас увидел объяснение что \name: bedroom_switch\ это не просто имя а объявление переключателя и все заработало.

  6. # timer.yaml
    
    test_timer:
      name: test timer
      duration: '00:05:00'
    
    
    # automations.yaml
    
    - alias: auto1
      trigger:
        entity_id: binary_sensor.zvonok_button
        platform: state
        to: 'on'
      condition:
        condition: state
        entity_id: 'timer.test_timer'
        state: 'idle'
      action:
      - service: notify.telegram
        data:
          message: Звонок!
      - service: timer.start
        data:
          entity_id: timer.test_timer
    
    • Только сегодня добрался до компа. Попробовал сделанный вами конфиг — работает!
      Что не может не радовать)
      Правда пришлось заменить нотифер телеграма на ios push, телеграм почему-то перестал работать, уже и прокси менял, без толку.
      «Спасибо большое» кинул на кофе ))

    • Подскажите пожалуйста! Есть следующая автоматизация:
      При нажатии виртуального переключателя «input_boolean.nik_spat», включается «switch.alisa_rozetka» и затем через 30 мин отключается.
      Как сделать, чтобы время отключения задавать в интерфейсе, например слайдером от 5 мин до 60 или каким другим способом?
       

      - alias: 'nik_spat_avto'
        trigger:
        - platform: state
          entity_id:
                - input_boolean.nik_spat
          from: 'off'
          to: 'on'
        condition:
        action:
          - service: switch.turn_on
            data:
              entity_id:
                - switch.alisa_rozetka
      - alias: 'nik_son_alisa'
        trigger:
          platform: state
          entity_id:
            - input_boolean.nik_spat
          from: 'off'
          to: 'on'
        condition:
          - condition: state
            entity_id: input_boolean.nik_spat
            state: 'on'
        action:
        - delay:
           minutes: 30
        - service: switch.turn_off
          entity_id: switch.alisa_rozetka
      

       

      • Здравствуйте, у себя не делал, но, думаю, это можно реализовать через input_number. И в автоматизации указать в delay на него вместо количества минут.
         

         action:
         - delay:
             minutes: "{{ states('input_number.test_slider') | int }}"
        

         
         

        • Не сразу понял, как реализовать, но покопавшись разобрался! Спасибо за руководящую и направляющую роль в моём образовании!! :))

  7. Кстати, а насколько проблематична реализация данного кейса на ESPHome?

      • Под «кейсом» я подразумевал данную статью «Переключатель света на EspEasy в Home Assistant».
        Т.е. описываемый конечный функционал но вместо EspEasy использовать ESPHome. Всё таки интеграция ESPHome с ХА выглядит привлекательней ).

  8. esphome:
      name: bedroom_esp
      platform: ESP8266
      board: nodemcuv2
      on_boot:
        priority: 800
        # ...
        then:
          - output.turn_off: bedroom_light_relay
    
    # wifi сеть
    wifi:
      ssid: 'HomeWRLS'
      password: 'password'
      reboot_timeout: 60min
      manual_ip:
        static_ip: 192.168.1.112
        gateway: 192.168.1.1
        subnet: 255.255.255.0
    
    # Лог
    logger:
    
    # api
    api:
      password: 'bedroom_esp'
      reboot_timeout: 60min
    # ota
    ota:
      password: 'bedroom_esp'
    
    # Реле
    output:
      - platform: gpio
        pin: 
          number: D6
          inverted: true
          mode: OUTPUT
        id: bedroom_light_relay
    #    restore_mode: RESTORE_DEFAULT_OFF
    
    # Выключатель света
    light:
      - platform: binary
        name: bedroom_light
        output: bedroom_light_relay
        id: bedroom_light
    
    # Простой одноклавишный выключатель
    binary_sensor:
      - platform: gpio
        pin: 
          number: D5
          inverted: true
          mode: INPUT_PULLUP
        name: bedroom_light_button
        on_press:
          then:
          - light.toggle: bedroom_light
        on_release:
          then:
          - light.toggle: bedroom_light
    
    # Датчики
    sensor:
    
    # Сигнал wifi
      - platform: wifi_signal
        name: bedroom_esp_wifi
        update_interval: 30s
    
    # Текстовые датчики
    text_sensor:
      - platform: wifi_info
        ip_address:
          name: bedroom_esp_ip
    
    switch:
      - platform: restart
        name: bedroom_esp_restart
        id: bedroom_esp_restart
    
    • У меня полный швах! ((
      Поставил на убунту докер, хотел в него закинуть ha-supevised, а разрабы 10 мая «закрыли лавочку». Теперь ставится ha, в котором нет supervised!! Как его поставить теперь?! Второй день инет рою, ничего не могу найти по теме ((

      • Читал их блог, писали что где-то в архивах у них должны быть полные инструкции, сам не искал.

        • а я искал… и продолжаю искать))
          пока безуспешно… а столько планов уже настроил на ХА…

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Exit mobile version