Я хочу поставить водосчётчик, чтобы он считал количество использованной воды и через определённые промежутки литров выдавал сигнал о необходимости проведения обслуживания: заменить фильтр, досыпать соль и т.д., т.к. каждое действие нужно проводить через определённое количество литров.
А то это бывает забывается и уже меняешь когда видно, что с водой что-то не так, либо соль закончилась, либо фильтр забился и т.д.
В общем есть счётчик, который постоянно увеличивается, и надо чтобы через определённые периоды значений загорались уведомления в интерфейсе.
Я составил предварительный код.
var WaterCounter = "wb-mio-gpio_70:2/Counter 10";
var WaterConsumption = "Water/Consumption";
var SaltChangePeriod = 500;
var FilterChangePeriod = 1000;
defineVirtualDevice("Water", {
title: "Вода",
cells: {
Name: {
title: "Название",
type: "text",
value: "Вода",
},
Consumption: {
title: "Расход воды",
type: "value",
value: "",
units: "л",
precision: 0,
},
SaltChange: {
title: "Подсыпать соль",
type: "switch",
value: false,
readonly: true
},
SaltChangeDone: {
title: "Соль подсыпана",
type: "switch",
value: false,
},
FilterChange: {
title: "Заменить фильтр",
type: "switch",
value: false,
readonly: true
},
FilterChangeDone: {
title: "Фильтр заменили",
type: "switch",
value: false,
}
}
});
// действия при изменении счётчика воды
defineRule("WaterCounterRule", {
whenChanged: WaterCounter,
then: function (newValue, devName, cellName) {
dev[WaterConsumption] = newValue*4.5; // запись значения в ячейку виртуального устройства
// каждые 500, 1000, 1500 и т.д. литров надо делать следующее
if ( WaterConsumption % SaltChangePeriod === 0 ) {
// 1 - выводим alarm на домовой HMI панели
SendTelegramMsg( 'Расход воды = ' + dev[WaterConsumption] + ' л. Необходимо досыпать соль.' ); // 2 - отправляем сообщение в телегу
dev["Water/SaltChange"] = true; // 3 - устанавливаем значение SaltChange = true
}
}
});
// действия при нажатии SaltChangeDone
defineRule("SaltChangeDoneRule", {
whenChanged: "Water/SaltChangeDone",
then: function (newValue, devName, cellName) {
if ( newValue == true) {
dev["Water/SaltChange"] = false; // SaltChange возвращается к состоянию false только после нажатия кнопки SaltChangeDone
}
}
});
В нём есть несколько нюансов:
- Мне непонятно как выводить alarm на домовой HMI панели (это видимо тоже самое что и alarm в окне веб-интерфейса). Сообщение в телегу - это хорошо, но их бывает слишком много. Можно и пропустить.
- Возможно неплохая идея продолжать выводить alarm в HMI и слать сообщения в телегу два раза в сутки (в 9 и 19) пока не нажата кнопка SaltChangeDone. Может быть как-то в cron эти строки завернуть или в начале каждого дня делать проверку и если проверка не выполнена, то держи два уведомления.
- При нажатии SaltChangeDone просто возвращается состояние false у переключателя SaltChange. А было бы неплохо обнулять счётчик (или начинать новый отсчёт от момента нажатия SaltChangeDone), т.к. от напоминания до действия могло пройти какое-то время и какие-то литры.