Считывание показаний через MBUS и передача через MQTT Landis+Gyr Ultraheat UH50

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

//02_15_test_02.js
 
defineVirtualDevice("mbus", {
  title: "Mbus OUT", //
  cells: {
    Energy : {
        type : "text",
        value : "",
        readonly: false,
    },
    Power : {
        type : "text",
        value : "",
        readonly: false,
    },
  }
});


//var oParser = new DOMParser();



log.info ("START 02_15_test_02.js")
// Запуск shell-команды с захватом вывода
    runShellCommand("ls /etc", //сюда и записываем "mbus-serial-request-data /dev/ttyRS485-2 -d"
        {
      captureOutput: true, //Захватывать stdout
      captureErrorOutput: true, //Захватывать stderr (если нужно)
      exitCallback: function (exitCode, capturedOutput, capturedErrorOutput) //Функция, в которую попадает вывод
            {
                log("cmd output: " + capturedOutput); //строка полностью
                capturedArray = capturedOutput.split("\n"); //Разбиваем полученную строку по символу переноса строки.
                capturedArray.forEach(function(item, index){ //Для каждой строки
                  var tmpstring = item.trim(); //порежем пробелы
                  switch(tmpstring) {
                    case "<Unit>Energy (MJ)</Unit>": //Одно из условий
                      dev["mbus"]["Energy"] = capturedArray[index+1] //Выводим СЛЕДУЮЩУЮ строку в поле. ну и обработать как надо, если надо.
                    case "<Unit>Power (100 W)</Unit>": //Одно из условий
                      //log.info("index", index)
                      dev["mbus"]["Power"] = capturedArray[index+1] //ну и обработать как надо
                      //log.info(capturedArray[index+1])
                  }
                })
                log("cmd Erroroutput: " + capturedErrorOutput); //Если нужен вывод  stderr
            }
         })

Вот пример как раз нужного. Упаковать запуск внешнего приложения и парсинг в функцию - и вызывать по таймеру.

1 лайк