Добрый день.
А имя и контрол источника температуры какие?
Предполагаю что нужно правило:
//06_09_test_04.js
var hysteresis = 0.5;
var tempSensor = "hwmon/CPU Temperature"; //источник температуры
var TS = "VirtDevName/Control"; //переключаемый контрол
var nameRule = "sensor01Rule"; //Имя правила
var setpoint = 60; //Уставка
var hysteresis = 0.5; //Гистерезис
defineRule(nameRule, {
whenChanged: tempSensor, //при изменении состояния датчика
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ( newValue < setpoint - hysteresis) { //если температура датчика меньше уставки - гистерезис
dev[TS] = true;
}
if ( newValue > setpoint + hysteresis) { //если температура датчика больше виртуальной уставки + гистерезис
dev[TS] = false;
}
}
});
может это в нод ред проще сделать ? я просто непонимаю значений (вывод в лог, на входе в функцию правила, в условиях, покажите.)
может эту поправить и ненужно будет виртуального устройства ?
//
var cnt_umaxa = 0, cnt_umaxb = 0, cnt_umaxc = 0;
var cnt_umina = 0, cnt_uminb = 0, cnt_uminc = 0;
var cnt_imaxa = 0, cnt_imaxb = 0, cnt_imaxc = 0;
var umin = 20;
var umax = 25;
var imax = 25;
var alarm_min_max_phone = "chat_id=-1001775147598";
// https://wirenboard.com/wiki/Rule_Examples - создание однотипных правил
function makeUnMaxAlarm(name, device_name, cnt_un) {
defineRule(name, {
whenChanged: "mpu-adc-r1_166/" + device_name,
then: function(newValue, devName, cellName) {
if (newValue > umax) {
cnt_un = cnt_un + 1;
log("VRU: " + name + " /" + newValue +"/");
if ( cnt_un > 99 ) {
runShellCommand("curl -s -X POST https://api.telegram.org/bot5591760925:AAEg05G9BKPE29nwMDmP1t7AwZH_zsFMug0/sendMessage -d chat_id=-1001775147598 -d text='{}'".format(alarm_min_max_phone, device_name, newValue), {
captureOutput: true,
exitCallback: function(exitCode, capturedOutput) {
log("VRU: " + name + " SMS " + capturedOutput);
return;
}
});
cnt_un = 0
}
}
}
});
}
whenChanged: “mpu-adc-r1_166/” я так понимаю тут нужно ставить мое устройство с которого берется информация (wb-msw-v3_49/Temperature)
sms нужно наверное поменять на (curl -s -X POST https://api.telegram.org/bot5591760925:AAEg05G9BKPE29nwMDmP1t7AwZH_zsFMug0/sendMessage -d chat_id=-1001775147598 -d text=’{}’")
а вот текст сообщения хз где указывать или он просто параметры устройства будет присылать ?
Насчет “проще” - по-моему наоборот сложнее,там надо хорошо понимать как и что передается между блоками, для меня NR наоборот подозрителен своей закрытостью. Но подкупает поначалу нагляным интерфейсом, да.
Без виртуального йстройства делать и отображение в svg непосредственно по датчику? Нет, это с моей точки зрения нехолроший путь, так как решение а именно сравнение должно происходить в одном месте, а если происходит в разных - то значение уставки должно быть общим. Недаром модульность ПО придумана, так гораздо надежней.
не я думал без SVG панели. просто напрямую информацию по датчику отправлять непосредственно в телеграмм канал, есть порог допустимых температур допустим от 20 до 25 и если больше или меньше тогда приходит напрямую сообщение в телеграмм канал о том что на таком то датчике температура выше или ниже нормы. как-то так
использовал два скрипта
первый на максимальную температуру второй на минимальную
defineRule("alarm_event", {
whenChanged: "wb-msw-v3_49/Temperature",
then: function (newValue, devName, cellName) {
if (newValue < 20) {
var command = 'curl -s -X POST https://api.telegram.org/bot5591760925:AAEg05G9BKPE29nwMDmP1t7AwZH_zsFMug0/sendMessage -d chat_id=-1001775147598 -d text="Внимание! температури ниже 20 !!!" ';
runShellCommand(command);
}
}
});
на максимальную вот
defineRule("alarm_event", {
whenChanged: "wb-msw-v3_49/Temperature",
then: function (newValue, devName, cellName) {
if (newValue > 25) {
var command = 'curl -s -X POST https://api.telegram.org/bot5591760925:AAEg05G9BKPE29nwMDmP1t7AwZH_zsFMug0/sendMessage -d chat_id=-1001775147598 -d text="Внимание! повышение температуры выше 25 !!!" ';
runShellCommand(command);
}
}
});
но его нужно допиливать, так как при превышение или при уменьшение температуры изменение каждой 0,1 он сообщает и получается как спам может время какоето задать чтоб он не каждую секунду отправлял ? и еще какбы сделать так чтоб он говорил с какого конкретного датчика эти сообщения.
или на кажый датчик температуры писать скрипт и в сообщение уже подписывать с какого инфа ?
Я б просто ввел переменную, которую проверял перед отправкой. Типа:
if (newValue > 25) {
if(!sended) {
sended=true;
var command = 'curl -s -X POST https://api.telegram.org/bot5591760925:AAEg05G9BKPE29nwMDmP1t7AwZH_zsFMug0/sendMessage -d chat_id=-1001775147598 -d text="Внимание! повышение температуры выше 25 !!!" ';
runShellCommand(command);
}
}
else{
sended=false;
}
Ну и определять ее надо вне функции правила, естественно.
В функцию передается кроме newValue еще и devName, cellName. Почему не использовать имя? Ну и второй вариант - создать несколько правл тоже вполне допустим.
Ну и второй вариант - создать несколько правл тоже вполне допустим. (этот вариант мне просто понятен, вопрос а если датчиков температуры будет много допустим 100 это получается 200 скриптов писать . как контроллер это переварит ? понятное дело что 100 датчиков температуры не будет в моем случае, но просто интересно как быть в таком случае? )
я так понимаю эта команда заставляет сообщать исключительно когда меняются целые числа а не десятые ?
смотрите у меня наверное есть решение этого вопросса по постоянным сообщениям. у нас есть такая возможность в регистре температуры создать (Precise temperature) который отображает нам даже сотые. а можно в регистре температыру поставить значение чтоб отображал исключительно целые ? и затем топик этот укажу в скрипте. спам таким образом я думаю прекратится.
Здравствуйте! Можно создать виртуальное устройство с каналом температуры, в которое записывать округленное до целых исходное значение. По изменению значения виртуального устройства отправлять сообщения. Но это не спасет от отправки множественных сообщений при некоторых значениях температуры.
Как вариант решения проблемы - запоминать предыдущее отправленное значение температуры. Отправлять новое значение температуры только если оно отличается от предыдущего отправленного на заданную величину.