RF433 кнопки по Mqtt - d51x/openhab-docs-russian GitHub Wiki

Один из вариантов добавления радио-кнопок в OpenHAB это использование esp8266/esp32 с примеником радио-сигналов с какой либо кастомной прошивкой (tasmota, esphome, wifi-iot и т.д.).

Устройство на esp сигналы от радио-кнопок, транслирует их в коды кнопок и публикует их в соответствующий топик.

Настройка Thing и Channel

wifi-iot:

<login><device-name>/rcdata

например в топик dacha/lr-light/rcdata придет сообщение с кодом кнопки 8353160

Tasmota:

TBD

Далее создаем Mqtt Thing и настраиваем channel

image

Заполняем поля:

  • Channel Identifier - указываем название канала, например, button (если устройство имеет только одну физическую кнопку) или button1 (если устройство имеет несколько физических кнопок), или buttonLeft, ну и так далее..

  • Label - указываем понятное человеческое название

  • Description - заполняем по желанию. Я указываю код кнопки, чтобы всегда было видно и не забыть

  • Channel type - выбираем Trigger

  • MQTT Trigger Topic - указываем топик, куда публикуются коды

Так же ставим галку Show advanced и дополнительно настраиваем трансформацию

JINJA:{{ value == 8353160 ? "pressed" : "" }}

image

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

Далее мы это будем использовать в правилах для управления светом или вентилятором.

Важно!

Требуется установка дополнительной трансформации JINJA

Создание правила с использованием канала

Теперь создадим правило для управления светом при нажатии кнопки.

Есть много вариантов создания правил, но я настраиваю так - одно правило для включения, второе правило для выключения (это имеет свои преимущества в некоторых случая).

Правило 1. Включить свет

image

Добавляем триггер, при котором сработает правило.

Выбираем Thing Event

image

Далее выбираем Thing, который создавали (сейчас картинка будет отличаться, т.к. скрин с боевой среды)

image

Далее выбираем a trigger channel fired, т.е. когда сработает триггер, выбираем channel, т.е. при получении кода нужной кнопки

image

Далее надо надо в поле event указать, при каком условии реагировать.

Указываем pressed, то значение, которое писали в шаблоне трансформации выше

image

Настройка триггера готова. Теперь настроим действия и условия.

image

Правило 2. Выключить свет

Все делаем тоже самое, настраиваем тот же самый триггер.

А далее делаем так

image

Преимущество добавления кнопки в таком виде

Можно было бы так не делать, не создавать Thing, а просто в правиле прописать в триггере условие по изменению состояния item, если оно равно коду кнопки (при условии, что у вас уже есть другой thing, который имеет канал, который принимает коды и есть привязанный item, который подставляется код).

Либо можно было бы настроить условие в триггере канала не как presses, а как код кнопки.

В любом случает, тогда коды кнопок были бы размазаны по разным правилам.

В моем подходе появляется абстракция устройства с кнопками.

Эти абстрактные кнопки уже используются в правилах.

Почему два правила, а не одно?

Во-первых, не используя код (javascript, blockly, dsl), на текущий момент, OpenHAB не умеет одним действием в правиле переключать состояние Switch-item.

Если использовать код (скрипт), в котором будет проверяться состояние и преключаться item, это имеет один существенный недостаток для меня.

В ОХ 4, если используется DSL или JavaScript (GraalVM), то первый запуск правила длится очень долго. В моем случае (либо на raspberry pi3, либо на TV Box), первый запуск длится около 20 сек - происходит компиляция кода, но потом код выполняется быстро в следующие разы. В community.openhab.org есть такая тема, в которой обсуждают эту проблему, там так же до 20 сек доходит первый запуск.

Поэтому, когда вы перезапустили OpenHAB (причина не важна, например, отключали электричество), то после запуска OpenHAB вы нажимаете на кнопку и ....

  • в случае 2-х правил - свет у вас сразу включается
  • в случае одного правила со скриптом - свет у вас не включается, вы ждете 20 сек и беситесь )))
⚠️ **GitHub.com Fallback** ⚠️