Добро пожаловать в АД или создаем первое правило автоматизации.

Это серия статей «Node-Red как паутина».

Часть 0. Пилот. Легкий способ добавления увлажнителя в HomeKit через Node-red.

Часть 1. Продолжаем добавлять xiaomi smartmi zhimi air humidifier 2 в NODE-RED.

Часть 2. Добавляем Telegram бота через Node-RED.

Введение

Правила автоматизации в первую очередь переназначены для того, чтобы выполнять за нас все рутинные действия. И так, прежде всего нам надо определить «цель» нашего правила автоматизации (далее – правило). Потом необходимо определить все возможные либо интересующие нас сценарии. И потом дело за малым – реализовать.

Цель

После написания второй части так вышло, что я не успел долить воды в увлажнитель, по приходу домой я обнаружил полностью сухой бак и бешено вращающийся вентилятор, согласно информации, которую транслировало устройство, оно перешло в режим высушивания. После чего на нем образовался известковый налет, который было очень сложно отмыть. Кроме того в квартире стоял крайне неприятный запах. Пошел искать информацию – оказалось что режим высушивания включается по умолчанию настройками самого устройства для того что б вода не стояла и там не плодились бактерии и прочая гадость. Поэтому было решено создать правило автоматизации. Цель, которого при достижении низкого уровня воды устройство выключается. При повышении уровня воды выше установленного уровня устройство включается.

Сценарии

Цели и задачи ясны, получаем 2 условия.

  1. При достижении уровня воды менее 10% выключить устройство.
  2. При достижении уровня воды более 35% включить устройство.

Это и будет нашим правилом автоматизации, добавим уведомления в созданного ранее бота о срабатывании автоматизации. Получаем цикл из трех уведомлений

  1. Уведомление о критическом уровне воды (у нас уже работает);
  2. Уведомление о выключении устройства.
  3. Уведомление о включении устройства.

В результате получив два вот таких уведомления:

Мы понимаем что устройство выключено из за нехватки воды, доливаем воды и получаем третье уведомление:

Вот собственно и все. Приступим к реализации.

Конфигурирование флоу

Приступаем к самой интересной части. Для этого модернизируем наш флоу  из предыдущей статьи. Начнем изменять кубик «Меньше/больше» и добавляем критерии согласно ранее продуманным сценариям. Обращаю внимание  от 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. Заходите.

Author

Write A Comment