Wb-rules не работает после перезагрузки

Добрый вечер!

Столкнулся с проблемой. После перезагрузки (нестабильно) правила перестают работать.
Пробовал удалять все скрипты и загружать самый простой из примеров - не помогло.
service wb-rules restart не помогает

root@wirenboard-ANMSNLVK:/etc/wb-rules# cat /var/log/messages | grep wb-rules | tail
Oct 15 14:00:08 wirenboard-ANMSNLVK daemon.info wb-rules[1861]: INFO: [rule info] 
Oct 15 14:00:08 wirenboard-ANMSNLVK daemon.info wb-rules[1861]: INFO: MQTT connection established
Oct 15 14:00:08 wirenboard-ANMSNLVK daemon.info wb-rules[1861]: ERROR: command '/bin/sh -c echo 3  > /sys/class/pwm/pwmchip0/export' failed with exit status 1
Oct 15 14:27:51 wirenboard-ANMSNLVK daemon.info wb-rules[1861]: INFO: reloading file: /etc/wb-rules/MyRules.js
Oct 15 14:31:57 wirenboard-ANMSNLVK daemon.info wb-rules[3671]: INFO: MQTT connection established
Oct 15 14:31:57 wirenboard-ANMSNLVK daemon.info wb-rules[3671]: INFO: [rule info] 
Oct 15 14:31:57 wirenboard-ANMSNLVK daemon.info wb-rules[3671]: ERROR: command '/bin/sh -c echo 3  > /sys/class/pwm/pwmchip0/export' failed with exit status 1
Oct 15 14:42:57 wirenboard-ANMSNLVK daemon.info wb-rules[4314]: INFO: MQTT connection established
Oct 15 14:42:57 wirenboard-ANMSNLVK daemon.info wb-rules[4314]: INFO: [rule info] 
Oct 15 14:42:57 wirenboard-ANMSNLVK daemon.info wb-rules[4314]: ERROR: command '/bin/sh -c echo 3  > /sys/class/pwm/pwmchip0/export' failed with exit status 1

Сам процесс висит…

root@wirenboard-ANMSNLVK:/etc/wb-rules# ps -aux | grep wb-rules
root      4314  7.3 10.4 866024 12804 ?        Sl   14:42   0:19 /usr/bin/wb-rules -syslog -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/
root      4481  2.0  1.6   5968  2076 pts/0    S+   14:47   0:00 grep wb-rules

Помогает обновление прошивки на ту же версию через веб-интерфейс.
Но потом всё равно после выключения wb-rules не работают.

У вас в коде правил есть что-то помимо вызовов defineRule() и defineVirtualDevice()?

Только defineRule, обернут 3 раза для разных топиков:

Скрипт
var Days = Object.freeze({
    "MON": 1,
    "TUE": 2,
    "WED": 3,
    "THU": 4,
    "FRI": 5,
    "SAT": 6,
    "SUN": 0});

var regulation1 = function(newValue, devName, cellName) {
    if (newValue == '0') {
        return;
    }
    runShellCommand("echo " + cellName + " > /log.txt");

    var count = Number(dev["wb-mr6c_57"]["K1"]) +
                Number(dev["wb-mr6c_57"]["K2"]) +
                Number(dev["wb-mr6c_57"]["K3"]);

    if (count > 2) {
        if ((dev["wb-mr6c_57"]["K1"] == '1') && (cellName != "K1")) {
            dev["wb-mr6c_57"]["K1"] = '0';
        }
        else if (((dev["wb-mr6c_57"]["K2"] == '1') && (cellName != "K2"))) {
            dev["wb-mr6c_57"]["K2"] = '0';
        }
        else if ((dev["wb-mr6c_57"]["K3"] == '1') && (cellName != "K3")) {
            dev["wb-mr6c_57"]["K3"] = '0';
        }
    }
};

var regulation2 = function(newValue, devName, cellName) {

};

var time_map = [
    [
        {
            date_check: function(time) {
                return true;
            },
            command: regulation1
        }
    ]
];

function makeMotionDetector(rule_name, timeout_ms, device, monitoring_cell) {
defineRule(rule_name, {
    whenChanged: device + '/' + monitoring_cell,
    then: function(newValue, devName, cellName) {
        var do_exit = false;
        var now = new Date();

        for (var layer = time_map.length - 1; layer >= 0; layer--) {

            for (var i in time_map[layer]) {
                if (time_map[layer][i].date_check(now)) {
                    time_map[layer][i].command(newValue, devName, cellName);
                    do_exit = true;
                    break;
                }
            }

            if (do_exit) {
                break;
            }
        }
    }
});
}

makeMotionDetector('switch_regulation_1', 1000, 'wb-mr6c_57', 'K1');
makeMotionDetector('switch_regulation_2', 1000, 'wb-mr6c_57', 'K2');
makeMotionDetector('switch_regulation_3', 1000, 'wb-mr6c_57', 'K3');

Заметил следующее:

  1. Обновляю контроллер через web
  2. Правило работает
  3. reboot
  4. Правило работает
  5. Подкладываю свой конфиг mosquitto.conf и делаю service mosquitto restart
  6. Правило работает
  7. reboot
  8. Правило не работает
  9. Реле через веб щелкают
  10. Подкладываю базовый конфиг
  11. service mosquitto restart
  12. Правила работают
mosquitto.conf
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example


######
##  Общие параметры

# Файл, содержащий идентификационный номер процесса (pid).
# Актуально только для режима Daemon
pid_file /var/run/mosquitto.pid

# Сохранение текущего состояния в БД
persistence true

# Путь для хранения БД. В конце ОБЯЗАТЕЛЬНО "/"
persistence_location /var/lib/mosquitto/

# Автосахранение состояния брокера при изменении состояния
autosave_on_changes true

# Дополнительные файлы с конфигурациями
include_dir /etc/mosquitto/conf.d

# Очищать данные клиента при неактивности более чем $PARAM
persistent_client_expiration 1m # 1 месяц

# PreSharedKey
#psk_file file path

# Очередь сообщений для QoS 0, на случай, когда сервер недоступен.
# Нестандартная опция. По умолчанию очередь сообщений используется только для QoS 1 и 2
#queue_qos0_messages false

# Сообщение от брокера до клиента будет доставлено с QoS указанным подписчиком
upgrade_outgoing_qos true

# Разрешены только локальные клиенты
#bind_address localhost

# Разрешить дублирование сообщений
# Например, если клиент 2 раза подписался на один и тот-же топик, сообщение придет 2 раза
allow_duplicate_messages true


######
##  Мост

# Название бриджа, он же идентификатор моста
connection my-connection-2000

# Адрес сервера
# Может быть указано несколько адресов
address 192.168.2.100:1883

# Запрет очистки сессии
# Все данные при после обрыва соединения будут восстановлены
cleansession false

# Мониторинг онлайна клиентов
# TODO: Понять как работает
notifications true
# notifications_local_only true

# Переподключение после обрыва через 5 секунд
# (лучше больше, но для стенда сойдет, т.к. трафик не учитывается)
restart_timeout 5

# Список топиков для передачи на сервер
topic # both 2 /iq/bridge/ /iq/my-connection-2000/

Zeta, здравствуйте! А какая версия прошивки стоит сейчас на вашем контроллере? У вас, судя по серийнику, Wiren Board 5.9?

Прошивал это
201808271801_webupd_wb58_stretch.fit

Стер настройки бриджа из mosquitto.conf - регуляции заработали 0_о
Перебираю варианты дальше…

Просто если объявить мост wb-rules не работают.

connection my-connection-2000
address 192.168.2.100:1883
topic # both 2 /iq/bridge/ /iq/my-connection-2000/

Прошу прощения, с бриджом все нормально.
wb-rules из строя выводит параметр
upgrade_outgoing_qos true

То есть без этого:

проблема решается полностью?

Пишу:
#upgrade_outgoing_qos true
и выполняю
service mosquitto stop && service wb-rules stop && service mosquitto start && service wb-rules start
Регуляция работает.

Пишу:
upgrade_outgoing_qos true
и выполняю
service mosquitto stop && service wb-rules stop && service mosquitto start && service wb-rules start
Регуляция не работает.

И так стабильно несколько раз воспроизвелось. В том числе после перезагрузки.

Ну да, если закомментировать эту строку, регуляции работают, а других проблем нету.

К сожалению, опять столкнулся с проблемой надёжности продукта. На этот раз не выдержал движок правил.
Перегрузил контроллер и только через полдня обнаружил, что система не работает. Стал разбираться и обнаружил, что сценарии не выполняются, хотя проверяю и вижу несоответствие:
В логах пестрит следующее:
Sep 22 02:59:25 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: WARNING: MQTT connection lost
Sep 22 02:59:25 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: INFO: MQTT connection established

А если проверить так, то все красиво:
root@wirenboard-ARAXKJYF:~# service wb-rules status
[ ok ] wb-rules is running.

В процессе перезагрузки Linux видно, что Файлы с правилами загружались и начали выполняться, но потом происходит необъяснимое:
Sep 22 02:39:39 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: INFO: [rule info] [LAUNDRY]: Humidity 32.8%. Vent OFF
Sep 22 02:39:40 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: INFO: [rule info] [STAIRS 1]: MOVING DETECTOR ACTIVATED… Light is ON
Sep 22 02:39:53 wirenboard-ARAXKJYF user.notice wb-mqtt-db[3347]: 2019-09-22 02:39:53.459 NOTICE: DB logger started, go to main loop
Sep 22 02:40:00 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: WARNING: MQTT connection lost
Sep 22 02:40:00 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: INFO: MQTT connection established
Sep 22 02:40:20 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: WARNING: MQTT connection lost
Sep 22 02:40:20 wirenboard-ARAXKJYF daemon.info wb-rules[3405]: INFO: MQTT connection established

последние строки повторяются.

Я все понимаю, продукт не из коробки и его надо допиливать похоже вечно, но такие ситуации с надежностью меня сильно пугают, и ужасно, что я не могу быть вовремя уведомлен о происходящем. Объясните, что происходит ?

Есть подозрение, что на контроллере забивается очередь MQTT-сообщений.
Попробуйте увеличить значение mdдва-три раза
export WB_RULES_QUEUES_LEN=2048
в файле /etc/default/wb-rules

Сожалею, что вам пришлось столкнуться со многими проблемами при запуске контроллера в эксплуатацию. Опыт наших клиентов показывает, что в общем и целом контроллеры надежны, а все возникающие проблемы мы стараемся решать в поддержке.

К сожалению, такого файла там не нашел. Создать его или он сам должен создаваться?
А почему нигде в инструкции об этом не говорится? или у меня одного очередь такая большая? тогда ограничения надо обозначить в документации. Это ваша ахилесова пята судя по прочитанным отзывам.
Да, простому смертному эти устройства не запустить, а если и удастся, то поддержку и обслуживание не потянуть. Это конструктор для терпеливых и экономных, в первую очередь. Я бы согласился и втрое купить дороже, при условии минимального участия. Но, боюсь, до этого далеко. Может терпение еще не иссякнет ))

Да, создайте файл и перезапустите движок правил.
Посмотрите, подхватилось ли изменение (ps -ef | grep wb-rules):
/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/
Сама по себе эта проблема не так часто всплывает, только на больших инсталляциях и загруженных контроллерах.
Обращайтесь, мы всегда рады вам помочь, если что-то непонятно или не работает, как хотелось бы.


root@wirenboard-ARAXKJYF:~# service wb-rules restart
[ ok ] Restarting MQTT Rule Engine for Wiren Board: wb-rules.
root@wirenboard-ARAXKJYF:~# ps -ef | grep wb-rules
root 17161 1 26 00:13 ? 00:00:14 /usr/bin/wb-rules -syslog -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/
root 17237 17095 0 00:14 pts/2 00:00:00 grep wb-rules

На WB 5 слишком мало свободной ОЗУ из-за чего постоянное использование swap. Также “Load average” почти всегда около или больше 1 (https://www.booleanworld.com/guide-linux-top-command/).
Для себя решил крутить правила (node-red) и доп интерфейс (Home Assistant) на стороннем контроллере/сервере. На wb-rules оставил только критические правила и никаких таймеров.
Либо… менять WB5 на WB6.

1 лайк

Не подхватилась настройка, попробуйте тогда прописать переменную непосредственно в /etc/init.d/wb-rules
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

Вместо $WB_RULES_QUEUES_LEN укажите, скажем 10000.

Там нет этого параметра вовсе.
DAEMON_ARGS=“$WB_RULES_OPTIONS -syslog -editdir ‘$RULE_DIR’ ‘$SYSTEM_RULE_DIR’ ‘$RULE_DIR’ ‘$PRIVATE_RULE_DIR’”

вставить $WB_RULES_QUEUES_LEN в строку параметров может надо?