Разделите команду и подтверждённое состояние
home/kitchen/relay/set
home/kitchen/relay/state
home/kitchen/temperature/state
home/kitchen/relay/availability
Панель отправляет ON в set. После переключения реле публикует результат в state. Интерфейс показывает подтверждённое состояние из state, а ожидание ответа отмечает отдельно. Если подтверждения нет, панель сообщает об этом, не выдавая отправленную команду за выполненную.
Что помечать RETAIN
Храните последнее состояние, если оно полезно после перезапуска панели. Команду включения, открытия замка или одиночного импульса обычно публикуют без RETAIN. Иначе устройство при новой подписке может получить старую команду. Для опасного действия дополнительно задайте срок годности и проверку идентификатора на устройстве.
Значение availability полезно хранить как последнее состояние, но его нужно обновлять при подключении. Задайте Last Will со значением offline и публикуйте online при успешном соединении.
Пример потока Node-RED
Узел MQTT In принимает home/kitchen/temperature/state. Узел проверки преобразует значение в число и отбрасывает ошибочные или устаревшие измерения. Затем правило сравнивает температуру с двумя разными порогами, чтобы реле не дребезжало у одной границы. MQTT Out публикует команду в home/kitchen/relay/set.
Добавьте отдельный MQTT In на home/kitchen/relay/state для подтверждения. После перезапуска Node-RED убедитесь, что он видит состояние, но не запускает старое действие.
Какие права выдать
- Датчик пишет только в собственную ветку состояния.
- Контроллер реле читает свой топик команд и пишет состояние.
- Автоматика читает нужные ей ветки и публикует только разрешённые команды.
- Внешний доступ к брокеру защищайте TLS; локальный доступ ограничьте правилами сети и учётными записями.