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

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

//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) который отображает нам даже сотые. а можно в регистре температыру поставить значение чтоб отображал исключительно целые ? и затем топик этот укажу в скрипте. спам таким образом я думаю прекратится.

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

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

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

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

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.