Выполнение правила после полной загрузки WB


#1

Подскажите, есть WBIO-DO-R1G-16, подключен к реле.
Нужно после полной загрузки WB, часть реле включить, часть выключить.
Можно просто указать в скрипте, например, dev[“wb-gpio”][“EXT1_K1”] = 1;
Но такой вариант, то работает, то нет, на странице со скриптами появляется сообщение Error listing the configs: MQTT RPC request timed out.
Я создал виртуальную кнопку и включаю/выключаю реле через нее, вручную.

Вопрос есть ли какое-нибудь условие, которое бы выполнялось после полной загрузки Wiren Board’а? Я бы тогда создал правило, указал это условие для включения виртуальной кнопки.


#2

Во-первых, можете попробовать новую версию движка правил: Бета-тестирование новой версии движка правил
Если в ней наблюдаются те же проблемы, то можете спрашивать у разработчика.
Во-вторых, можете привязать выполнение вашего правила к аптайму контроллера - если поставить туда 3 минуты, этого должно быть достаточно.


#3

Подскажите, как правильно сравнить Current uptime и 0d 0h 3m?

defineRule("test", {
  whenChanged: ["system/Current uptime"],
  then: function(newValue) {
    if (newValue == "0d 0h 3m") { //даже если newValue = 0d 0h 3m, возвращает false (я так понимаю, это из-за того, что сравниваются разные объекты)
      log("ok");
    } else {
      log(newValue);
      log(typeof newValue);
      log("0d 0h 3m");
      log(typeof "0d 0h 3m");
    }
  }
});

#4

Мне кажется, надо вот так сравнить строки: https://www.tutorialspoint.com/What-is-the-best-way-to-compare-two-strings-in-JavaScript


#5

Спасибо, я пробовал данный способ, не работает.

defineRule("test", {
  whenChanged: ["system/Current uptime"],
  then: function(newValue) {
    var uptime1 = newValue;
    var uptime2 = "3d 5h 8m";
    var ft = uptime1.localeCompare(uptime2);
    if (uptime1 === uptime2) {
      log("ok");
    } else {
      log(uptime1);
      log(typeof uptime1);
      log(uptime2);
      log(typeof uptime2);
      log(ft);
    }
  }
});

daemon.info wb-rules[2623]: INFO: [rule info] 3d 5h 8m
daemon.info wb-rules[2623]: INFO: [rule info] string
daemon.info wb-rules[2623]: INFO: [rule info] 3d 5h 8m
daemon.info wb-rules[2623]: INFO: [rule info] string
daemon.info wb-rules[2623]: INFO: [rule info] 1

По идее должен вернуться 0, но всегда возвращается 1.
string_a.localeCompare(string_b);
0: exact match
-1: string_a < string_b
1: string_a > string_b


#6

Мне кажется проще взять uptime из /proc/uptime (значение в секундах) и уже потом сравнивать это число

log ("Start");

defineRule("sys_date", {
    whenChanged: [ "system/Current uptime" ],
    then: function(newValue) {
	   runShellCommand("cat /proc/uptime", {
            captureOutput: true,
              exitCallback: function (exitCode, capturedOutput) {
                var uptime1=parseInt(capturedOutput);
                log(uptime1);
                log(typeof uptime1);
              }
            });
    }
});

020-01-31 13:21:30Start

2020-01-31 13:21:471513402

2020-01-31 13:21:47number