# Выполнение правил с учетом нестабильного сигнала

**URL:** <https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375>\
**Category:** Rule Engine\
**Created:** [January 11, 2019, 12:07pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375 "2019-01-11T12:07:23Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zeta](https://support.wirenboard.com/user_avatar/support.wirenboard.com/zeta/32/30536_2.png) [@Zeta](https://support.wirenboard.com/u/Zeta)\
**Post date:** [January 11, 2019, 12:07pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375/1 "2019-01-11T12:07:23Z")

</div>

Добрый день!

Я хочу синхронизировать 2 реле (master - slave), при чем каждый из них может периодически терять соединение с контроллером.

Можно ли не изобретая велосипед повторно выполнить MQTT команду (или нечто подобное) на включение/выключение реле после восстановления сигнала?

Сейчас, если связь со slave на момент **whenChanged** была потеряна, состояние slave не придет в нужное после восстановления состояния.

```
defineRule("test_rule_1", {
    whenChanged: "wb-mr3_30/K1",
    then: function(newValue, devName, cellName) {
        dev["wb-mr6c_57"]["K1"] = newValue;
    }
});
```

---

<div class="post-metadata">

**Author:** ![Flagman](https://support.wirenboard.com/user_avatar/support.wirenboard.com/flagman/32/1081_2.png) [@Flagman](https://support.wirenboard.com/u/Flagman)\
**Post date:** [January 11, 2019, 1:24pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375/2 "2019-01-11T13:24:30Z")

</div>

1. создать “референсный” виртуальный девайс
2. из его состояния записывать состояния реле 1 и реле 2
3. после очередной записи сделать проверку состояния реле 1 и реле 2
4. если это не удается сделать с каким-то реле, значит с ним связи нет - цикл запись-проверка соответствующего реле
5. если значение не совпадает, значит “синхронизация” не произошла, произвести повторно

---

<div class="post-metadata">

**Author:** ![Zeta](https://support.wirenboard.com/user_avatar/support.wirenboard.com/zeta/32/30536_2.png) [@Zeta](https://support.wirenboard.com/u/Zeta)\
**Post date:** [January 11, 2019, 1:41pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375/3 "2019-01-11T13:41:48Z")

</div>

```
root@wirenboard-ANMSNLVK:~# mosquitto_sub -t /devices/wb-mr3_30/controls/K1/# -v &
[1] 9247
/devices/wb-mr3_30/controls/K1/meta/type switch
/devices/wb-mr3_30/controls/K1/meta/order 1
/devices/wb-mr3_30/controls/K1 1

root@wirenboard-ANMSNLVK:~# mosquitto_pub -t /devices/wb-mr3_30/controls/K1/on -m 0
/devices/wb-mr3_30/controls/K1/on 0
/devices/wb-mr3_30/controls/K1 0

# выдергиваю wb-mr3_30

/devices/wb-mr3_30/controls/K1/meta/error r

mosquitto_pub -t /devices/wb-mr3_30/controls/K1/on -m 1
/devices/wb-mr3_30/controls/K1/on 1
/devices/wb-mr3_30/controls/K1 1
/devices/wb-mr3_30/controls/K1/meta/error rw

# подключаю wb-mr3_30
/devices/wb-mr3_30/controls/K1/meta/error w
/devices/wb-mr3_30/controls/K1 0
root@wirenboard-ANMSNLVK:~# mosquitto_pub -t /devices/wb-mr3_30/controls/K1/on -m 1
/devices/wb-mr3_30/controls/K1/on 1
/devices/wb-mr3_30/controls/K1 1
/devices/wb-mr3_30/controls/K1/meta/error (null)

```

проблема в том, что даже если девайс отключен, значение топика меняется.

---

<div class="post-metadata">

**Author:** ![Flagman](https://support.wirenboard.com/user_avatar/support.wirenboard.com/flagman/32/1081_2.png) [@Flagman](https://support.wirenboard.com/u/Flagman)\
**Post date:** [January 11, 2019, 1:48pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375/4 "2019-01-11T13:48:16Z")

</div>

Значение топика /devices/wb-mr3\_30/controls/K1/on меняется в mqtt-клиенте, а не на устройстве.

```
root@wirenboard-ANMSNLVK:~# mosquitto_sub -t /devices/wb-mr3_30/controls/K1/# -v &
[1] 9247
/devices/wb-mr3_30/controls/K1/meta/type switch
/devices/wb-mr3_30/controls/K1/meta/order 1
/devices/wb-mr3_30/controls/K1 1

root@wirenboard-ANMSNLVK:~# mosquitto_pub -t /devices/wb-mr3_30/controls/K1/on -m 0
/devices/wb-mr3_30/controls/K1/on 0
/devices/wb-mr3_30/controls/K1 0

# выдергиваю wb-mr3_30

/devices/wb-mr3_30/controls/K1/meta/error r

mosquitto_pub -t /devices/wb-mr3_30/controls/K1/on -m 1
/devices/wb-mr3_30/controls/K1/on 1
/devices/wb-mr3_30/controls/K1 1
/devices/wb-mr3_30/controls/K1/meta/error rw

# подключаю wb-mr3_30
/devices/wb-mr3_30/controls/K1/meta/error w
/devices/wb-mr3_30/controls/K1 0

```

Здесь считайте значение реле вместо повторной публикации

```
root@wirenboard-ANMSNLVK:~# mosquitto_pub -t /devices/wb-mr3_30/controls/K1/on -m 1
/devices/wb-mr3_30/controls/K1/on 1
/devices/wb-mr3_30/controls/K1 1
/devices/wb-mr3_30/controls/K1/meta/error (null)
```

---

<div class="post-metadata">

**Author:** ![Zeta](https://support.wirenboard.com/user_avatar/support.wirenboard.com/zeta/32/30536_2.png) [@Zeta](https://support.wirenboard.com/u/Zeta)\
**Post date:** [January 11, 2019, 2:02pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375/5 "2019-01-11T14:02:40Z")

</div>

Как виртуальные устройства реагируют на перезагрузку контроллера?  
Сохранится предыдущее состояние?

---

<div class="post-metadata">

**Author:** ![Zeta](https://support.wirenboard.com/user_avatar/support.wirenboard.com/zeta/32/30536_2.png) [@Zeta](https://support.wirenboard.com/u/Zeta)\
**Post date:** [January 11, 2019, 2:51pm UTC](https://support.wirenboard.com/t/vypolnenie-pravil-s-uchetom-nestabilnogo-signala/2375/6 "2019-01-11T14:51:27Z")

</div>

Код синхронизации состояний двух реле:

```
   defineVirtualDevice("wb-mr3_30_v", {
      title: "Regulations Switch",
      cells: {
        K1: {
          type: "switch",
          value: false // default
        }
      }
    });

    defineVirtualDevice("wb-mr6c_57_v", {
      title: "Regulations Switch",
      cells: {
        K1: {
          type: "switch",
          value: false // default
        }
      }
    });

    defineVirtualDevice("common_switch", {
      title: "Regulations Switch",
      cells: {
        K1: {
          type: "switch",
          value: false // default
        }
      }
    });

    defineRule("wb-mr3_30_back_sync", {
        whenChanged: "wb-mr3_30/K1",
        then: function(newValue, devName, cellName) {
            if (dev["wb-mr3_30_v"]["K1"] != newValue) {
                dev["wb-mr3_30"]["K1"] = dev["wb-mr3_30_v"]["K1"];
            }
        }
    });

    defineRule("wb-mr6c_57_back_sync", {
        whenChanged: "wb-mr6c_57/K1",
        then: function(newValue, devName, cellName) {
            if (dev["wb-mr6c_57_v"]["K1"] != newValue) {
                dev["wb-mr6c_57"]["K1"] = dev["wb-mr6c_57_v"]["K1"];
            }
        }
    });

    defineRule("wb-mr6c_57_rule", {
        whenChanged: "wb-mr6c_57_v/K1",
        then: function(newValue, devName, cellName) {
            dev["wb-mr6c_57"]["K1"] = newValue;
        }
    });

    defineRule("wb-mr3_30_rule", {
        whenChanged: "wb-mr3_30_v/K1",
        then: function(newValue, devName, cellName) {
            dev["wb-mr3_30"]["K1"] = newValue;
        }
    });

    defineRule("common_switch_rule", {
        whenChanged: "common_switch/K1",
        then: function(newValue, devName, cellName) {
            dev["wb-mr3_30_v"]["K1"] = newValue;
            dev["wb-mr6c_57_v"]["K1"] = newValue;
        }
    });

```

Устойчив к потере сигнала реле и к перезагрузкам.

По поводу сохранения состояния виртуального устройства тупанул, там же retained. Восстанавливается по последнему сообщению.

Спасибо за идею 😀
