Добро пожаловать в АД или создаем первое правило автоматизации.
Это серия статей «Node-Red как паутина».
Часть 0. Пилот. Легкий способ добавления увлажнителя в HomeKit через Node-red.
Часть 1. Продолжаем добавлять xiaomi smartmi zhimi air humidifier 2 в NODE-RED.
Часть 2. Добавляем Telegram бота через Node-RED.
Введение
Правила автоматизации в первую очередь переназначены для того, чтобы выполнять за нас все рутинные действия. И так, прежде всего нам надо определить «цель» нашего правила автоматизации (далее – правило). Потом необходимо определить все возможные либо интересующие нас сценарии. И потом дело за малым – реализовать.
Цель
После написания второй части так вышло, что я не успел долить воды в увлажнитель, по приходу домой я обнаружил полностью сухой бак и бешено вращающийся вентилятор, согласно информации, которую транслировало устройство, оно перешло в режим высушивания. После чего на нем образовался известковый налет, который было очень сложно отмыть. Кроме того в квартире стоял крайне неприятный запах. Пошел искать информацию – оказалось что режим высушивания включается по умолчанию настройками самого устройства для того что б вода не стояла и там не плодились бактерии и прочая гадость. Поэтому было решено создать правило автоматизации. Цель, которого при достижении низкого уровня воды устройство выключается. При повышении уровня воды выше установленного уровня устройство включается.
Сценарии
Цели и задачи ясны, получаем 2 условия.
- При достижении уровня воды менее 10% выключить устройство.
- При достижении уровня воды более 35% включить устройство.
Это и будет нашим правилом автоматизации, добавим уведомления в созданного ранее бота о срабатывании автоматизации. Получаем цикл из трех уведомлений
- Уведомление о критическом уровне воды (у нас уже работает);
- Уведомление о выключении устройства.
- Уведомление о включении устройства.
В результате получив два вот таких уведомления:
Мы понимаем что устройство выключено из за нехватки воды, доливаем воды и получаем третье уведомление:
Вот собственно и все. Приступим к реализации.
Конфигурирование флоу
Приступаем к самой интересной части. Для этого модернизируем наш флоу из предыдущей статьи. Начнем изменять кубик «Меньше/больше» и добавляем критерии согласно ранее продуманным сценариям. Обращаю внимание от 100 до 35.
Второй выход у нас остается неизменным в соответствии с прошлым решением.
На выход 1 и 3 мы ставим ноду «change» и меняем нагрузку с типа «msg» на тип «Boolean», выставляя для первого выхода «true».
А для 3 выхода «false».
Далее отправляем это все кубик управления «ВКЛ/Выкл» устройством, я использую кубик задействованный в дашборде.
И собственно все, наше правило закончено и работает.
Приступаем ко второй части отправке уведомлений.
Для этого в продолжение выхода 1 и 3 мы ставим ноду «change» и меняем нагрузку «payload» на наше сообщение.
Ну и для выключения пишем «Увлажнитель гостиная выключен».
И получаем вот такую картинку.
И вроде все работает, к работе устройств претензий нет. Но вот с уведомлениями маленькая проблема, так как у нас в настройках стоит статус отправлять состояние устройства каждые 5 секунд (а как выяснилось датчик уровня воды в данной модели корявый и каждые 5 секунд показания скачут на +- 3 %) то мы получаем каждые 5 секунд уведомление, выглядит это так.
Для менее спамящих устройств наверно такая конфигурация подойдет, но нам нет. После долгих изысков было решено использовать глобальные переменные для фильтрации сообщений.
В сообществе помогли и написали формулу отправки сообщений о уровне воды:
var characteristics; var level = global.get("Less15"); if (msg.payload < 15 && (level === false || level === undefined || level === null)) { characteristics = "Уровень воды в увлажнителе детская достиг критического минимума"; } else if (msg.payload > 35 && (level === true || level === undefined || level === null)) { characteristics = "Воды в увлажнителе детская больше 35 %"; } node.status({fill:"blue",shape:"ring","text": "Уровень: "+msg.payload" %"}); if (msg.payload < 15) { global.set("Less15", true); node.status({fill:"red",shape:"ring","text": "Уровень: "+msg.payload" % Мало воды"}); } else if (msg.payloadl > 35) { global.set("Less15", false); node.status({fill:"green",shape:"ring","text": "Уровень: "+msg.payload" % Достаточно воды"}); } if (characteristics === undefined || characteristics === null) { return; } msg.payload = characteristics; return msg;
Немного исправив получаем формулу уведомлений о включении выключении:
var characteristics; var level = global.get("ON"); if (msg.payload === true && (level === false || level === undefined || level === null)) { characteristics = "Увлажнитель в детской автовключение, достаточный уровень воды"; } else if (msg.payload === false && (level === true || level === undefined || level === null)) { characteristics = "Увлажнитель в детской автовыключение, низкий уровень воды"; } node.status({fill:"blue",shape:"ring","text": "Увлажнитель в детской включен"}); if (msg.payload === true) { global.set("ON", true); node.status({fill:"green",shape:"ring","text": "Увлажнитель в детской включен"}); } else if (msg.payload === false) { global.set("ON", false); node.status({fill:"red",shape:"ring","text": "Увлажнитель в детской выключен"}); } if (characteristics === undefined || characteristics === null) { return; } msg.payload = characteristics; return msg;
И вот такая картинка.
Проверяем наши глобальные переменные. Если они есть значит все хорошо.
В итоге получаем вот такой флоу.
На этом на сегодня все. Данным образом можно реализовать уведомления любого формата.
Подобное и многое другое обсуждается в нашем telegram чате https://t.me/indahomekit_chat. Заходите.