# Зависает движек правил при перезапуске

**URL:** <https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703>\
**Category:** Rule Engine\
**Created:** [October 3, 2019, 12:52pm UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703 "2019-10-03T12:52:50Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vini74](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vini74/32/5479_2.png) [@Vini74](https://support.wirenboard.com/u/Vini74)\
**Post date:** [October 3, 2019, 12:52pm UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/1 "2019-10-03T12:52:51Z")

</div>

Уменьшил код по максимуму. В целом правило можно заставить работать, если править его в вебинтерфейсе, и там сохранить, при работающем движке правил. Но если Движек перезапустить, то он виснет (ну и при рестарте контроллера тоже самое).  
WB6/

```javascript
defineVirtualDevice("vehicle", {
    title: "vehicle",
    cells: {

    bunker_level: {
      type: "value",
      value: 0,
        forceDefault: true 
  }
 
  }
});

defineRule("bunker level", {
	whenChanged: ["wb-mr6c_1/Input 1", "wb-mr6c_1/Input 2", "wb-mr6c_1/Input 3", "wb-mr6c_1/Input 4", "wb-mr6c_1/Input 5"],
  	then: get_bunker_level()
});

function get_bunker_level() {
        if(dev["wb-mr6c_1"]["Input 5"] == true) { dev["vehicle/bunker_level"] = 100; return }
    	dev["vehicle"]["bunker_level"] = 0; 
	   };

```

---

<div class="post-metadata">

**Author:** ![Kilpio](https://avatars.discourse-cdn.com/v2/letter/k/3ab097/32.png) [@Kilpio](https://support.wirenboard.com/u/Kilpio)\
**Post date:** [October 3, 2019, 2:48pm UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/2 "2019-10-03T14:48:54Z")

</div>

Такое ощущение, что не все MQTT-топики успевают подгрузится при старте движка правил.  
Попробуйте остановить его сервис и запустить в командной строке, будут ли ошибки?  
(В этом сообщении описано как: [WB-rules срабатывают несколько раз](https://support.wirenboard.com/t/wb-rules-srabatyvayut-neskolko-raz/3129/10?u=kilpio))

---

<div class="post-metadata">

**Author:** ![Vini74](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vini74/32/5479_2.png) [@Vini74](https://support.wirenboard.com/u/Vini74)\
**Post date:** [October 3, 2019, 3:47pm UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/3 "2019-10-03T15:47:21Z")

</div>

[wbrules.txt](https://support.wirenboard.com/uploads/default/original/2X/3/3a8c5c918f45c5536897384567e93a5592a90727.txt) (7.1 КБ)  
Добавлю. Проблема появилась когда я вынес функцию наружу.  
then: function () { … } вполне работало.

---

<div class="post-metadata">

**Author:** ![Kilpio](https://avatars.discourse-cdn.com/v2/letter/k/3ab097/32.png) [@Kilpio](https://support.wirenboard.com/u/Kilpio)\
**Post date:** [October 4, 2019, 9:17am UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/4 "2019-10-04T09:17:54Z")

</div>

Я думаю, вы столкнулись как раз с неопределенными последствиями, которые описаны [в документации](https://github.com/contactless/wb-rules) :  
`Не следует использовать объект`dev`вне кода правил. Не следует присваивать значения параметрам через`dev`вне`then`-функций правил и функций обработки таймеров (коллбэки`setInterval`/`setTimeout`). В обоих случаях последствия не определены.`

Как-то надо переписать вам код, чтобы не использовать dev не внутри обработчика.

---

<div class="post-metadata">

**Author:** ![Vini74](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vini74/32/5479_2.png) [@Vini74](https://support.wirenboard.com/u/Vini74)\
**Post date:** [October 4, 2019, 10:00am UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/5 "2019-10-04T10:00:27Z")

</div>

Не красиво получается. Дублирование кода происходит. Но спасибо, буду думать.

---

<div class="post-metadata">

**Author:** ![bzzeke](https://support.wirenboard.com/user_avatar/support.wirenboard.com/bzzeke/32/15721_2.png) [@bzzeke](https://support.wirenboard.com/u/bzzeke)\
**Post date:** [October 4, 2019, 10:23am UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/6 "2019-10-04T10:23:48Z")

</div>

Мне кажется надо  
`then: get_bunker_level()`  
заменить на  
`then: get_bunker_level`

А сейчас у вас функция `get_bunker_level` вызывается при вызове `defineRule`

---

<div class="post-metadata">

**Author:** ![Vini74](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vini74/32/5479_2.png) [@Vini74](https://support.wirenboard.com/u/Vini74)\
**Post date:** [October 4, 2019, 1:38pm UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/7 "2019-10-04T13:38:12Z")

</div>

Похоже Вы очень даже правы! Жаль я уже все переделал. Но это очень хорошая новость.  
А как обрабатываются несколько файлов правил?  
Можно в отдельном файле прописать функции, в отдельном параметры и алиасы, в отдельном описание виртуального устройства, в отдельном сами правила?

---

<div class="post-metadata">

**Author:** ![Kilpio](https://avatars.discourse-cdn.com/v2/letter/k/3ab097/32.png) [@Kilpio](https://support.wirenboard.com/u/Kilpio)\
**Post date:** [October 7, 2019, 8:13am UTC](https://support.wirenboard.com/t/zavisaet-dvizhek-pravil-pri-perezapuske/3703/8 "2019-10-07T08:13:21Z")

</div>

Сейчас дела обстоят так:  
[Начиная с версии wb-rules 1.7, локальные переменные и функции, объявленные в файле сценария не видны в других сценариях. Таким образом, каждый сценарий может определять свои функции и переменные без риска изменить поведение других сценариев.](https://wirenboard.com/wiki/index.php/%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_wb-rules_1.7)

В [версии движка 2.0](https://github.com/contactless/wb-rules/releases) появилась [возможность использовать модули](https://wirenboard.com/wiki/index.php/%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_wb-rules_2.0) (как в node.js), можно поэкспериментировать с ними. Но это пока далеко не продакшн-версия.
