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

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

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

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

1 Like

Подскажите, как правильно сравнить 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");
    }
  }
});

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

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

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

Мне кажется проще взять 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

2 Likes

Добрый день!
Подскажите пожалуйста как именно в итоге удалось решить вашу проблему? У меня аналогичная ситуация - иногда отрубает свет и нужно, чтобы после включения также сразу включались некоторые реле.

У меня через regex получилось

defineRule("uptime", {
    whenChanged: ["system/Current uptime"],
    then: function (newValue) {
        var regexpNames = /(\d{1,})d (\d{1,})h (\d{1,})m/mg;
        var match = regexpNames.exec(newValue);
        log(match[1] + "  " + match[2] + "  " + match[3]);
        if(match[1]==0&&match[2]==3&&match[3]==44){
            log("ok")
        }

    }
});
1 Like

Здравствуйте!
Проверил работу сравнения строк. Вот тестовое правило:

    var uptimeSystem = dev["system/Current uptime"];
    var uptimeCustom = "0d 2h 39m";

    log("-------------------");
	log('uptimeSystem = ' + uptimeSystem + '  uptimeCustom = ' + uptimeCustom);
    if (uptimeSystem === uptimeCustom) {
      log('Operator "===" returned 1 -> Strings are equal');
    } else {
	  log('Operator "===" returned 0 -> Strings are not equal');
    }

	if (uptimeSystem.localeCompare(uptimeCustom) === 0) {
      log('Function "localeCompare" returned 0 -> Strings are equal');
    } else {
	  log('Function "localeCompare" returned not 0 -> Strings are not equal');
    }

Вот результат работы:

2021-09-27 10:30:26-------------------
2021-09-27 10:30:26uptimeSystem = 0d 2h 39m uptimeCustom = 0d 2h 38m
2021-09-27 10:30:26Operator "===" returned 0 -> Strings are not equal
2021-09-27 10:30:26Function "localeCompare" returned not 0 -> Strings are not equal
2021-09-27 10:30:30-------------------
2021-09-27 10:30:30uptimeSystem = 0d 2h 39m uptimeCustom = 0d 2h 39m
2021-09-27 10:30:30Operator "===" returned 1 -> Strings are equal
2021-09-27 10:30:30Function "localeCompare" returned 0 -> Strings are equal

То есть оба способа работают. Версия движка правил 2.10.0.

По непонятным причинам. Само правило не срабатывает после перезагрузки. Если зайти в правило что нить поменять (т.е. вызвать reload) - Все работает ок.

Версия движка правил 1.7.1

Здравствуйте!
Проверил правило с regex на контроллере версии 6.7.2 с версиями движка правил wb-rules 2.6.0 и 2.10.0 - все работает сразу после перезагрузки.
Проверьте статус сервиса wb-rules сразу после перезагрузки командой:
service wb-rules status

Также посмотрите логи на наличие сообщений об ошибках.

root@wirenboard-AEUQHNW4:~# service wb-rules status
● wb-rules.service - LSB: MQTT Rule Engine for Wiren Board
   Loaded: loaded (/etc/init.d/wb-rules; generated; vendor preset: enabled)
   Active: active (running) since Mon 2021-10-18 12:04:04 MSK; 19min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 541 ExecStart=/etc/init.d/wb-rules start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/wb-rules.service
           └─621 /usr/bin/wb-rules -syslog -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/

окт 18 12:03:59 wirenboard-AEUQHNW4 systemd[1]: Starting LSB: MQTT Rule Engine for Wiren Board...
окт 18 12:04:04 wirenboard-AEUQHNW4 systemd[1]: Started LSB: MQTT Rule Engine for Wiren Board.
окт 18 12:04:38 wirenboard-AEUQHNW4 wb-rules[621]: INFO: [rule info] add your rules to /etc/wb-rules/
окт 18 12:04:38 wirenboard-AEUQHNW4 wb-rules[621]: INFO: MQTT connection established

Правила начинаю работу cron и по uptime начинаю свою работу только после “пересохранения” правила в web

Пришлите скриншот окна System со страницы Devices, а также отдельным файлом перечень установленных пакетов, с помощью команды:

dpkg -l | grep wb-

Если есть возможность, то я бы рекомендовал обновить все ПО контроллера.

image package.txt (4.5 КБ)
Часто при загрузке вот так

root@wirenboard-AEUQHNW4:~# service wb-rules status
● wb-rules.service - LSB: MQTT Rule Engine for Wiren Board
   Loaded: loaded (/etc/init.d/wb-rules; generated; vendor preset: enabled)
   Active: active (running) since Thu 2016-11-03 20:17:28 MSK; 4 years 11 months ago
     Docs: man:systemd-sysv-generator(8)
  Process: 604 ExecStart=/etc/init.d/wb-rules start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/wb-rules.service
           └─680 /usr/bin/wb-rules -syslog -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

Пока не перезагрузишь.

root@wirenboard-AEUQHNW4:~# service wb-rules restart
root@wirenboard-AEUQHNW4:~# service wb-rules status
● wb-rules.service - LSB: MQTT Rule Engine for Wiren Board
   Loaded: loaded (/etc/init.d/wb-rules; generated; vendor preset: enabled)
   Active: active (running) since Wed 2021-10-20 09:41:54 MSK; 7s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 4555 ExecStop=/etc/init.d/wb-rules stop (code=exited, status=0/SUCCESS)
  Process: 4564 ExecStart=/etc/init.d/wb-rules start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/wb-rules.service
           └─4571 /usr/bin/wb-rules -syslog -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/

окт 20 09:41:53 wirenboard-AEUQHNW4 systemd[1]: Starting LSB: MQTT Rule Engine for Wiren Board...
окт 20 09:41:54 wirenboard-AEUQHNW4 systemd[1]: Started LSB: MQTT Rule Engine for Wiren Board.
окт 20 09:41:58 wirenboard-AEUQHNW4 wb-rules[4571]: INFO: [rule info] add your rules to /etc/wb-rules/
окт 20 09:41:58 wirenboard-AEUQHNW4 wb-rules[4571]: INFO: MQTT connection established
окт 20 09:41:58 wirenboard-AEUQHNW4 wb-rules[4571]: ERROR: command '/bin/sh -c echo 3  > /sys/class/pwm/pwmchip0/export' failed with exit status 1

Но для работы правил cron и uptime помогает только пересохранение через web. Все пакеты обновлены через upgrade

Вот это вот странно (дата старта и время работы сервиса):

Active: active (running) since Thu 2016-11-03 20:17:28 MSK; 4 years 11 months ago

И вот это:

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

Место на флешке контроллера есть? Посмотреть так:

df -h

По скриншоту у вас самый свежий релиз, а по версиям пакетов все очень старое. Так как многие проблемы в новых версиях ПО были решены, я бы все-таки рекомендовал обновиться. Есть инструкция, как обновить прошивку: Обновление прошивки контроллера Wiren Board 6 — Wiren Board.
На всякий случай процитирую (нужно выполнять все точно по инструкции):

Репозиторий ПО и ветки релизов
Новый репозиторий ПО Wiren Board
С апреля 2021 года программное обеспечение контроллера Wiren Board выпускается в формате периодических релизов, также изменился путь к основному репозиторию. Старый репозиторий больше не поддерживается, новых обновлений не будет.

На старых контроллерах (до мая 2021 года) для перехода на работу с релизами надо сделать пару шагов:

Если на контроллере есть интернет, то выполните команды:

apt update && apt dist-upgrade
в систему будет установлен пакет wb-configs, а сама система обновится.
После обновления выполните эти команды ещё раз:

apt update && apt dist-upgrade
ПО контроллера переключится на текущий релиз stable и обновится, или на релиз testing, если ранее вы включали репозиторий unstable.
Если на контроллере нет интернета, то можете обновить контроллер через веб-интерфейс и fit-файл.
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
tmpfs            1,6G         2,4M  1,6G            1% /run
/dev/nvme0n1p5   215G         160G   44G           79% /
tmpfs            7,7G         186M  7,5G            3% /dev/shm
tmpfs            5,0M         4,0K  5,0M            1% /run/lock
tmpfs            4,0M            0  4,0M            0% /sys/fs/cgroup
/dev/nvme0n1p1    96M          31M   66M           32% /boot/efi
tmpfs            1,6G         2,9M  1,6G            1% /run/user/1000

У меня Wb5 - я недавно обновил через web (fit)
Сейчас выполнил по инструкции обновление (apt update && apt dist-upgrade) - все также
Пакеты еще раз приложил
package.txt (4.5 КБ)

На контрорллере нет таких разделов.
Это выполнено на компьютере?
Все команды и действия что советуем - надо выполнять на контроллере

Все прошло вообще вез ошибок? Или на результаты работы команд не смотрели?

Извиняюсь

root@wirenboard-AEUQHNW4:~# df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
/dev/root          976M         487M  422M           54% /
devtmpfs            60M            0   60M            0% /dev
tmpfs               61M            0   61M            0% /dev/shm
tmpfs               61M         520K   60M            1% /run
tmpfs              5,0M         4,0K  5,0M            1% /run/lock
tmpfs               61M            0   61M            0% /sys/fs/cgroup
/dev/mmcblk0p6     1,4G         578M  733M           45% /mnt/data
tmpfs               12M            0   12M            0% /run/user/0

Обновление я выполнял на контроллере

root@wirenboard-AEUQHNW4:~# apt update && apt dist-upgrade
Сущ:1 http://deb.wirenboard.com/wb5/stretch stable InRelease                                                                                                                                                
Игн:3 http://deb.debian.org/debian stretch InRelease                                                                                                              
Сущ:4 http://security.debian.org stretch/updates InRelease                                                    
Сущ:5 http://deb.debian.org/debian stretch-updates InRelease                                                  
Сущ:6 http://deb.debian.org/debian stretch Release                                                                        
Пол:2 http://cdn-fastly.deb.debian.org/debian stretch-backports InRelease [91,8 kB]                                       
Получено 91,8 kБ за 35с (2 586 Б/c)                                                                                                                                                                         
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Все пакеты имеют последние версии.
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Расчёт обновлений… Готово
обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.

Версия debian на контроллере - еще 8? Если да тогда - только полное обновление до актуальной, по статье Обновление прошивки контроллера Wiren Board 5 — Wiren Board
Если свежее - тогда надо для начала заменить репозитории на актуальные, http://deb.wirenboard.com/

root@wirenboard-AEUQHNW4:~# cat /etc/issue
Debian GNU/Linux 9 \n \l

Про репозитории не понял.

root@wirenboard-AEUQHNW4:~# cat /etc/apt/sources.list.d/wirenboard.list 
# This file is automatically generated by wb-release.
# DO NOT EDIT THIS FILE!
#
# If you want to switch to testing, use command
#   wb-release -t testing
deb http://deb.wirenboard.com/wb5/stretch stable main

Разве это не актуальный?