Создание правила для отправки температуры в телеграм канал

Всем привет. есть телеграм бот , в нод ред сделал так. при вводе определенных команд есть ответ от контроллера по тем параметрам которые мне необходимы. нужно сделать так чтоб при превышение пороговой температуры контроллер сам отправлял мне сообщение в телеграм канал . я посмотрел видеоурок ( Видеоурок 11 - “Отправка уведомлений в Telegram”) (Видеоурок 11 - "Отправка уведомлений в Telegram" - YouTube) все создал как указано в этом уроке. но дело в том что в моем случае этот пример не совсем подходит. решил сделать так чтоб в скрипте обрашался к виртуальному устройству. при включение приходит команда при выключение тоже приходит команда. в свг панели привязал к этому виртуальному устройству параметры датчика при превышение которых у меня получается включено выключено. но дело втом что это включение и выключение отображается исключительно на самой svg панели . как сделать так чтоб в устройстве срабатывало включение или выключение от показаний датчика.
1



6
то-есть при нажатие он сообщения отправляет. а как привязать кнопку в виртуальном устройстве к датчику температуры . я не совсем понимаю

Добрый день.
А имя и контрол источника температуры какие?
Предполагаю что нужно правило:

//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;
    }
  }
});

имя wb-msw-v3_49
контрол /devices/wb-msw-v3_49/controls/Temperature

Да, отлично. Пишите его в источник и соответственно переключаемый контрол - в TS переменные.

спасибо заработало. ну при превышении пишет что температура привышина а вот когда падает ниже не сообщает. а setpoint это что ? и гистерезист.

А switch переключается?
Вообще вывод в лог очень сильно помогает.

Уставка. Граница превышение которой считается поводом для срабатывания.

Вкратче - способ избежать постоянных срабатываний когда измеряемое значение находится вблизи уставки.

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

Вставьте вывод в лог, на входе в функцию правила, в условиях, покажите.
Ну и крайне сложно обсуждать что-то без самого кода.

может это в нод ред проще сделать ? я просто непонимаю значений (вывод в лог, на входе в функцию правила, в условиях, покажите.)

может эту поправить и ненужно будет виртуального устройства ?

// 
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 датчиков температуры не будет в моем случае, но просто интересно как быть в таком случае? )

Переварит отлично. Но для большого количества однотипных устройств (датчиков) проще одно правило, которое подписывается на топики по маске и уже в нем анализировать источник. Например Сообщение при отключении или неисправности в Telegram - #3 от пользователя BrainRoot

я так понимаю эта команда заставляет сообщать исключительно когда меняются целые числа а не десятые ?
смотрите у меня наверное есть решение этого вопросса по постоянным сообщениям. у нас есть такая возможность в регистре температуры создать (Precise temperature) который отображает нам даже сотые. а можно в регистре температыру поставить значение чтоб отображал исключительно целые ? и затем топик этот укажу в скрипте. спам таким образом я думаю прекратится.

Здравствуйте! Можно создать виртуальное устройство с каналом температуры, в которое записывать округленное до целых исходное значение. По изменению значения виртуального устройства отправлять сообщения. Но это не спасет от отправки множественных сообщений при некоторых значениях температуры.

Как вариант решения проблемы - запоминать предыдущее отправленное значение температуры. Отправлять новое значение температуры только если оно отличается от предыдущего отправленного на заданную величину.

Нет, флаг поднимается после отправки одного сообщения. Ну и следующие - не отправляются, естественно.

Сообщение было перенесено в новую тему: Получение значения с температурного датчика