Demostand: различия между версиями

Материал из Wiren Board
 
(не показаны 63 промежуточные версии 6 участников)
Строка 1: Строка 1:
Страница находится в процессе наполнения
{{DISPLAYTITLE: Демонстрационный стенд автоматизации с оборудованием Wiren Board}}
 
[[Файл:Demostand.jpg|500px|thumb|Демонстрационный стенд, вид спереди]]
[[Файл:Demostand-back.jpg|500px|thumb|Демонстрационный стенд, вид сзади]]
==Общая информация==
==Общая информация==
Фото
Демонстрационный стенд можно посмотреть в нашем офисе.


==Подключённые устройства==
==Подключённые устройства==
<gallery mode="packed" heights="150px">
Image: Demostand Devices RS485.jpg | Устройства на шине RS-485
Image: Demostand Devices WB6 + IO Modules.jpg | Контроллер с боковыми модулями ввода/вывода
Image: Demostand Devices Peripherals.jpg | Устройства для взаимодействия и датчики
</gallery>
{| class="wikitable"
{| class="wikitable"
! colspan="2" |Modbus устройства
! colspan="2" |Modbus устройства
! colspan="2" |Пристыковочные модули
|-
|-
|Модель
|[[WB-MR6C v.2 Modbus Relay Modules|WB-MR6C]]
|Описание
|6-канальный релейный модуль. Входы типа «Сухой контакт»
|Модель
|-
|Описание
|[[WB-MRWL3_Modbus_Relay_Module|WB-MRWL3]]
|Очень мощный 3-канальный релейный модуль. Входы вида «Сухой контакт»
|-
|[[WB-MDM3 230V Modbus Dimmer|WB-MDM3]]
|3-канальный диммер светодиодных ламп и ламп накаливания 230 В
|-
|[[WB-MRGBW-D Modbus LED Dimmer|WB-MRGBW-D]]
|4-канальный диммер светодиодных лент (на дин-рейку). Допустимый ток 3А на канал.
Отдельный канал для управления белыми лентами.
|-
|-
|WB-MR6HV/I
|[[Power_Meter_WB-MAP12H| WB-MAP12H]]
|Мощный 6-ти канальный релейный модуль. Входы 220В. [[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR6/ Купить.]
|Многоканальный счётчик электроэнергии.
|WBIO-R10A8
|Релейный модуль. До 7А/230В на канал. Идеален для
управления освещением/контакторами/моторами. [[Подробнее.]] [https://wirenboard.com/ru/product/WBIO-DO-R10A-8/ Купить.]
|-
|-
|WB-MR3LV/I
|[[WB-MIR v2 - Modbus IR Remote Control| WB-MIR v.2]]
|Мощный 3-х канальный релейный модуль. Входы вида "Сухой контакт" [[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|Модуль для управления устройствами посредством ИК сигналов, оснащён входом для температурного датчика.
|WBIO-HS-8
|Модуль с 8 выходами вида "High Side Switch"
[[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|-
|-
|WB-MDM2
! colspan="2" |Датчики
|Диммер ламп (как накаливания, так и светодиодных).
Номинальная мощность до 400Вт. [[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|WBIO-R1G16
|Релейный модуль с 16-ю выходами и общим каналом.
[[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|-
|-
|WB-MRGBW-D
|[[WB-MSW v.3 Modbus Sensor|WB-MSW v.3]]
|Диммер RGB-лент. Допустимый ток 3А на канал.
|Универсальный настенный датчик.
Отдельный канал для управления белыми лентами. [[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|WBIO-DI-DR14
|Модуль содержит 8 входов вида "Сухой контакт"
[[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|-
|-
|WB-MAP6S
|WB-MS/THLS
|6-ти канальный счётчик электроэнергии.
|Цифровой датчик температуры, влажности, освещённости и звукового давления с двумя входами для подключения 1-Wire датчиков.
[[Страница с документацией.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|WBE2-DI-DR-3
|Модуль расширения на 3 входа вида "Cухой кнтакт"
Вставляются внутрь корпуса Wiren Board [[Подробнее.]] [https://wirenboard.com/ru/product/WB-MR3/ Купить.]
|-
|-
|WB-MRM2mini/no
|[[Датчик газа WB-MSGR | WB-MSGR ]]
|
|Комбинированный электрохимический датчик газов со встроенным реле.
|-
|-
|WB-MIR
|[[WB-M1W2 1-Wire to Modbus Temperature Measurement Module|WB-M1W2 ]]
|
|Модуль для заведения двух 1-Wire датчиков в шину RS-485 и их опроса по протоколу Modbus.
|-
|-
! colspan="2" |Датчики
! colspan="2" |Боковые модули ввода/вывода
|-
|-
|WB-MSW2
|[[WBIO-DO-R10A-8 Relay Module | WBIO-DO-R10A-8]]
|
|Релейный модуль. До 7А/230В на канал. Идеален для управления освещением/контакторами/моторами.
|-
|-
|WB-MSW/THLS
|[[WBIO-DO-HS-8 Discrete Outputs | WBIO-DO-HS-8]]
|
|Модуль с 8 выходами вида "High Side Switch"
|-
|-
|WB-MSGR
|[[WBIO-DI-WD-14 Discrete Inputs | WBIO-DI-WD-14]]
|
|Универсальный модуль дискретных входов
|-
|-
|WB-M1W2
|[[WBIO-DI-HVD-16 16-Channel 230V Detector Module | WBIO-DI-HVD-16]]
|
|Модуль содержит 16 входов для детектирования высокого напряжения (220В).
|}
|}


==Правила==
==Правила==
При написании своих правил через движок WB-Rules, важно помнить, что код в правилах выполняется '''асинхронно'''.


====Датчик движения====
Если, в привычном понимании, выполнение кода идёт сверху-вниз, то в данном случае, выполнением управляет событийная модель: когда происходит то или иное событие (изменение показаний датчика/срабатывание таймера/нажатие на кнопку), то выполняется соответствующий кусок кода, отвечающий за обработку этого события. Подробнее о работе движка правил и типовых конструкциях обработки событий можно узнать из [[движок правил wb-rules|соответствующей статьи.]]
<div class="mw-collapsible mw-collapsed">
Показать код
<div class="mw-collapsible-content">
<code>
    defineAlias("movement_lamp", "wb-gpio/EXT1_R3A2");
    defineAlias("movement_virtual_switch", "movement_sensor_control/Иммитация движения");
    defineAlias("movement_timeout_before", "movement_sensor_control/Задержка после начала движения");
    defineAlias("movement_timeout_after", "movement_sensor_control/Задержка после прекращения движения");
   
    var motion_timer_before = null;
    var motion_timer_after = null;
   
    defineVirtualDevice("movement_sensor_control", {
        title: "Датчик движения",
        cells: {
            "Иммитация движения": {
                type: "switch",
                value: false
            },
            "Задержка после начала движения": {
                type: "range",
                value: 2,
                min: 1,
                max: 10
            },
            "Задержка после прекращения движения": {
                type: "range",
                value: 2,
                min: 1,
                max: 10
            }
   
   
        }
    });
   
    defineRule("physical_movement_to_virtual_switch", {
        whenChanged: "wb-gpio/EXT5_DR8",
        then: function(newValue, devName, cellName) {
            movement_virtual_switch = newValue;
   
        }
    });
   
   
    defineRule("movement_handler", {
        whenChanged: "movement_sensor_control/Иммитация движения",
        then: function(newValue, devName, cellName) {
            if (newValue == true) {
                if (motion_timer_before) {
                    clearTimeout(motion_timer_before);
                }
                motion_timer_before = setTimeout(function() {
                    movement_lamp = 1;
                    motion_timer_before = null;
                }, movement_timeout_before * 1000);
            } else {
                if (motion_timer_after) {
                    clearTimeout(motion_timer_after);
                }
                motion_timer_after = setTimeout(function() {
                    movement_lamp = 0;
                    motion_timer_after = null;
                }, movement_timeout_after * 1000);
            }
        }
    });
</code>
</div></div>


====Управление освещением====
Для управления стендом были созданы виртуальные устройства. Логика управления стендом выглядят следующим образом: нажатие на кнопку/переключение в веб-интерфейсе → срабатывание виртуального устройства → выполнение правила.
<div class="mw-collapsible mw-collapsed">
Код правила
<div class="mw-collapsible-content">
<code>
        defineAlias("small_light_switcher", "wb-msgr_9/Relay");
        defineAlias("lamp1_switcher", "wb-gpio/EXT2_K1");
       
        var FORCE_ILLUMINANCE_FLAG = false;
        var FORCE_LAMP_FLAG = false;
       
       
        defineVirtualDevice("switch_small_light", {
            title: "Управление освещением",
            cells: {
                "Принудительное освещение датчика": {
                    type: "switch",
                    value: false
                },
                "Включить освещение вручную": {
                    type: "switch",
                    value: false
                },
                "Уровень освещения днём": {
                    type: "range",
                    value: 500,
                    max: 1000
                }
       
            }
        });
       
       
        defineRule("small_light_control", {
            whenChanged: "switch_small_light/Принудительное освещение датчика",
            then: function(newValue, devName, cellName) {
                if (newValue == true) {
                    small_light_switcher = 1;
                    FORCE_ILLUMINANCE_FLAG = true;
                    dev["switch_small_light/Включить освещение вручную"] = false
                } else {
                    small_light_switcher = 0;
                    FORCE_ILLUMINANCE_FLAG = false;
                }
            }
        });
       
       
        defineRule("manual_light_control", {
            whenChanged: "switch_small_light/Включить освещение вручную",
            then: function(newValue, devName, cellName) {
                if (MANUAL_SWITCHER_1_FLAG == false) {
                if (newValue == true) {
                    lamp1_switcher = 1;
                    FORCE_LAMP_FLAG = true;
                    dev["switch_small_light/Принудительное освещение датчика"] = false
                } else {
                    lamp1_switcher = 0;
                    FORCE_LAMP_FLAG = false;
            }
                }
            }
        });
       
       
       
       
        defineRule("illuminance_ms_thls", {
            whenChanged: "wb-ms-thls-v2_8/Illuminance",
            then: function(newValue, devName, cellName) {
                if (MANUAL_SWITCHER_1_FLAG == false) {
                if (FORCE_ILLUMINANCE_FLAG == false && FORCE_LAMP_FLAG == false) {
                    if (newValue < dev["switch_small_light"]["Уровень освещения днём"]) {
                        lamp1_switcher = 1;
                    } else {
                        if (newValue > dev["switch_small_light"]["Уровень освещения днём"]) {
       
                            lamp1_switcher = 0;
                }
                        }
                    }
                }
            }
        });
</code>
</div></div>


====Ручное управление выключателями====
==Схема подключения==


<div class="mw-collapsible mw-collapsed">
Цвета соединений на схеме условные и не совпадают с цветами проводов в устройстве.
Код правила
<gallery mode="traditional " widths ="500px" heights="350px">
<div class="mw-collapsible-content">
Image: Demo stand left.png|| Схема подключения устройств на демонстрационном стенде: левая сторон
<code>
Image: Demo stand right.png| Схема подключения устройств на демонстрационном стенде: правая сторона
    defineAlias("lamp1_switcher_control", "wb-gpio/EXT2_K1");
</gallery>
    defineAlias("lamp2_switcher_control", "wb-mdm2_2/Channel 1");
    defineAlias("lamp3_switcher_control", "wb-mr3_3/K1");
   
    var MANUAL_SWITCHER_1_FLAG = false;
    var MANUAL_SWITCHER_2_FLAG = false;
    var MANUAL_SWITCHER_3_FLAG = false;
       
   
    defineRule("switcher_1", {
        whenChanged: "wb-gpio/EXT5_DR1",
        then: function(newValue, devName, cellName) {
        if (newValue == true) {
            MANUAL_SWITCHER_1_FLAG = true;
          lamp1_switcher_control = 1;
        }
        else {
        MANUAL_SWITCHER_1_FLAG = false;
        lamp1_switcher_control = 0;
        }
        }
    });
   
   
   
    defineRule("switcher_2", {
        whenChanged: "wb-gpio/EXT5_DR2",
        then: function(newValue, devName, cellName) {
        if (newValue == true) {
            MANUAL_SWITCHER_2_FLAG = true;
          lamp2_switcher_control = 100;
        }
        else {
        MANUAL_SWITCHER_2_FLAG = false;
        lamp2_switcher_control = 0;
        }
        }
    });
   
   
   
    defineRule("switcher_3", {
        whenChanged: "wb-gpio/EXT5_DR3",
        then: function(newValue, devName, cellName) {
        if (newValue == true) {
            MANUAL_SWITCHER_3_FLAG = true;
          lamp3_switcher_control = 1;
        }
        else {
        MANUAL_SWITCHER_3_FLAG = false;
        lamp3_switcher_control = 0;
        }
        }
    });
</code>
</div></div>


====Имитация управления кондиционером====
==SVG Дашборд==
<div class="mw-collapsible mw-collapsed">
В веб-интерфейсе контроллера Wiren Board можно создавать [[SVG-Dashboards | SVG-дашбрды]], это позволяет создать интерактивную мнемосхему.
Код правила
<div class="mw-collapsible-content">
<code>
    defineAlias("virtual_dimmer", "climate_system_control/Диммирование нагревателя");
    defineAlias("physical_dimmer", "wb-mdm2_2/Channel 1");
    defineAlias("temperature_sensor", "wb-m1w2_7/External Sensor 2")
    defineAlias("low_temp_value", "climate_system_control/Слишком низкая температура");
    defineAlias("norm_temp_value", "climate_system_control/Комфортная температура");
    defineAlias("high_temp_value", "climate_system_control/Слишком высокая температура");
   
    defineAlias("turn_on_red", "wb-mir-simple_10/Play from ROM1");
    defineAlias("turn_on_green", "wb-mir-simple_10/Play from ROM3");
    defineAlias("turn_on_blue", "wb-mir-simple_10/Play from ROM2");
   
    defineVirtualDevice("climate_system_control", {
        title: "Управление климатом",
        cells: {
            "Диммирование нагревателя": {
                type: "range",
                value: 20,
                min: 1,
                max: 100
            },
            "Слишком низкая температура": {
                type: "range",
                value: 24,
                min: 1,
                max: 35
            },
            "Слишком высокая температура": {
                type: "range",
                value: 28,
                min: 1,
                max: 45
            }
   
   
   
   
        }
    });
   
   
   
    defineRule("virtual_dimmer_to_physical", {
        whenChanged: "climate_system_control/Диммирование нагревателя",
        then: function(newValue, devName, cellName) {
            if (MANUAL_SWITCHER_2_FLAG == false) {
                physical_dimmer = newValue;
            }
        }
    });
   
   
   
    defineRule("indicate_temp", {
        whenChanged: "wb-m1w2_7/External Sensor 2",
        then: function(newValue, devName, cellName) {
            log(newValue);
            if (newValue <= low_temp_value) {
                turn_on_blue = 1;
                log("Low");
            }
   
            if ((newValue > low_temp_value) && (newValue < high_temp_value)) {
                turn_on_green = 1;
                log("normal");
            }
   
            if (newValue >= high_temp_value) {
                log(high_temp_value);
                turn_on_red = 1;
                log("High");
            }
        }
    });
</code>
</div></div>


====Управление вентилятором и миниреле====
В веб-интерфейсе демонстрационного стенда в режиме реального времени видно положение автоматов, реле, контакторов и нагрузок на стенде. Так же есть возможность переключать реле нажатием на интерактивные области (подсвечены фиолетовым).
<div class="mw-collapsible mw-collapsed">
[[Файл:Mnemo.png|1280px|thumb|center|SVG мнемосхема]]
Код правила
<div class="mw-collapsible-content">
<code>
    defineAlias("relay1_control", "wb-mrm2_11/Relay 1");
    defineAlias("relay_button_lamp", "wb-gpio/EXT3_HS4");
   
    defineAlias("fan_control", "wb-gpio/EXT3_HS5");
    defineAlias("fan_button_lamp", "wb-gpio/EXT3_HS6");
    defineAlias("virtual_fan_switch", "virtual_fan/Включить вручную");
    defineAlias("virtual_mrm2_mini_switch", "virtual_mrm2_mini/Включить вручную");
   
    defineVirtualDevice("virtual_fan", {
        title: "Управление вентилятором",
        cells: {
            "Включить вручную": {
                type: "switch",
                value: false
            }
        }
    });
   
    defineVirtualDevice("virtual_mrm2_mini", {
        title: "Управление миниреле",
        cells: {
            "Включить вручную": {
                type: "switch",
                value: false
            }
        }
    });
   
   
    defineRule("fan_virtual_to_physical", {
        whenChanged: "virtual_fan/Включить вручную",
        then: function(newValue, devName, cellName) {
            fan_control = newValue;
            fan_button_lamp = newValue;
   
        }
    });
   
   
    defineRule("mrm2_mini_virtual_to_physical", {
        whenChanged: "virtual_mrm2_mini/Включить вручную",
        then: function(newValue, devName, cellName) {
            relay1_control = newValue;
            relay_button_lamp = newValue;
   
        }
    });
   
   
   
    defineRule("fan_manual_turn_on", {
        whenChanged: "wb-gpio/EXT5_DR7",
        then: function(newValue, devName, cellName) {
            if (newValue == true) {
                virtual_fan_switch = !virtual_fan_switch;
   
            }
        }
    });
   
   
   
    defineRule("mini_relay_manual_turnon", {
        whenChanged: "wb-gpio/EXT5_DR9",
        then: function(newValue, devName, cellName) {
            if (newValue == true) {
                virtual_mrm2_mini_switch = !virtual_mrm2_mini_switch;
   
            }
        }
    });
</code>
</div></div>


====Ручное управление розетками====
==Файлы для скачивания==
<div class="mw-collapsible mw-collapsed">
По ссылкам ниже вы можете скачать схему подключения в форматах <br>
Код правила
'''Corel Draw 2018:''' [[Media:Demostand.cdr.zip|Demostand.cdr.zip]]
<div class="mw-collapsible-content">
<code>
defineAlias("rozetka1_control", "wb-mr6c_1/K1");
defineAlias("rozetka2_control", "wb-mr6c_1/K2");
defineAlias("rozetka1_virtual_control", "rozetkas_controls/Включить розетку 1");
defineAlias("rozetka2_virtual_control", "rozetkas_controls/Включить розетку 2");


'''Corel Draw PDF:''' [[Media:Demo stand.pdf|Demostand.pdf]]


'''SVG мнемосхема:''' [[Media:Demo stand.svg.zip|Demostand.svg.zip]]
==Таблицы MQTT Топиков==
{| class="wikitable"
! colspan="2" |WBIO-DO-R10A-8
|-
|wb-gpio/EXT1_R3A1
|Контактор NO: Лампы, Вентиляция, Индикаторы
|-
|wb-gpio/EXT1_R3A2
|Контактор NC: Розетки
|-
|wb-gpio/EXT1_R3A3
|Индикатор 1 (Розетка 1)
|-
|wb-gpio/EXT1_R3A4
|Индикатор 2 (Розетка 2)
|-
|wb-gpio/EXT1_R3A5
|Индикатор 3
|-
|wb-gpio/EXT1_R3A6
|Индикатор 4
|-
|wb-gpio/EXT1_R3A7
|Индикатор 5
|-
|wb-gpio/EXT1_R3A8
|Вентилятор
|}


defineRule("rozetka1_manual_turn_on", {
{| class="wikitable"
    whenChanged: "wb-gpio/EXT5_DR5",
! colspan="2" |WBIO-DO-HS-8
    then: function(newValue, devName, cellName) {
|-
        if (newValue == true) {
|wb-gpio/EXT2_HS1
            rozetka1_virtual_control = !rozetka1_virtual_control;
|Подсветка кнопки 1 (Розетка 1)
|-
|wb-gpio/EXT2_HS2
|Подсветка кнопки 2 (Розетка 2)
|-
|wb-gpio/EXT2_HS3
|Подсветка кнопки 3
|-
|wb-gpio/EXT2_HS4
|Подсветка кнопки 4
|-
|wb-gpio/EXT2_HS5
|Подсветка кнопки 5
|}


        }
{| class="wikitable"
    }
! colspan="2" |WBIO-DI-HVD-16
});
|-
|wb-gpio/EXT3_IN1
|Автомат: Розетка 1
|-
|wb-gpio/EXT3_IN2
|Автомат: Контроллер, Контакторы
|-
|wb-gpio/EXT3_IN3
|Контактор NO: Лампы, Вентиляция, Индикаторы
|-
|wb-gpio/EXT3_IN4
|Автомат: Ввод
|-
|wb-gpio/EXT3_IN5
|Автомат 3\3: Индикаторы
|-
|wb-gpio/EXT3_IN6
|Автомат 1\3: Лампы
|-
|wb-gpio/EXT3_IN7
|Автомат 2\3: Вентиляция
|-
|wb-gpio/EXT3_IN8
|Автомат: Розетка 2
|-
|wb-gpio/EXT3_IN9
|Напряжение на розетке 2
|-
|wb-gpio/EXT3_IN10
|Напряжение на розетке 1
|}


{| class="wikitable"
! colspan="2" |WBIO-DI-WD-14
|-
|wb-gpio/EXT4_IN1
|Кнопка 1
|-
|wb-gpio/EXT4_IN2
|Кнопка 2
|-
|wb-gpio/EXT4_IN3
|Кнопка 3
|-
|wb-gpio/EXT4_IN4
|Кнопка 4
|-
|wb-gpio/EXT4_IN5
|Кнопка 5
|-
|wb-gpio/EXT4_IN6
|Выключатель 1
|-
|wb-gpio/EXT4_IN7
|Выключатель 2
|-
|wb-gpio/EXT4_IN8
|Выключатель 3
|-
|wb-gpio/EXT4_IN9
|Датчик движения
|}


{| class="wikitable"
! colspan="2" |WB-MRWL3
|-
|wb-mr3_29/K1
|Реле Розетки 1
|-
|wb-mr3_29/K2
|Реле Розетки 2
|}


defineRule("rozetka2_manual_turn_on", {
{| class="wikitable"
    whenChanged: "wb-gpio/EXT5_DR4",
! colspan="2" |WB-MDM3
    then: function(newValue, devName, cellName) {
|-
        if (newValue == true) {
|wb-mdm2_2/Channel 1
            rozetka2_virtual_control = !rozetka2_virtual_control;
|Лампа 1
|-
|wb-mdm2_2/Channel 2
|Лампа 2
|}


        }
{| class="wikitable"
    }
! colspan="2" |WB-MR6C
});
|-
</code>
|wb-m6с_3/K1
</div></div>
|Лампа 3
|}


{| class="wikitable"
! colspan="2" |WB-MAP12H
|-
|wb-map12h_42/Ch 1 L1
|Автомат: Контроллер, Контакторы
|-
|wb-map12h_42/Ch 1 L2
|Автомат 1\3: Лампы
|-
|wb-map12h_42/Ch 1 L3
|Автомат 2\3: Вентиляция
|-
|wb-map12h_42/Ch 2 L1
|Автомат 3\3: Индикаторы
|-
|wb-map12h_42/Ch 2 L2
|Автомат: Розетка 1
|-
|wb-map12h_42/Ch 2 L3
|Автомат: Розетка 2
|}


====Поддержание заданной температуры====
{| class="wikitable"
<div class="mw-collapsible mw-collapsed">
! colspan="2" |WB-M1W2
Код правила
|-
<div class="mw-collapsible-content">
|wb-m1w2_72/External Sensor 1
<code>
|1-wire 2
    defineAlias("temperature_sensor_value", "wb-mir-simple_10/External Temperature Sensor");
|-
    defineAlias("small_fan_switcher", "wb-mrm2_11/Relay 2");
|wb-m1w2_72/External Sensor 2
    defineAlias("lamp3_switcher", "wb-mr3_3/K1");
|1-wire 1
    defineAlias("fan_virtual_switcher", "lamp3_manual/Включить вентилятор вручную");
|}
    defineAlias("lamp3_virtual_switcher", "lamp3_manual/Включить вручную");
   
    var MANUAL_FAN_FLAG;
    var MANUAL_LAMP3_FLAG;
   
   
    defineVirtualDevice("lamp3_manual", {
        title: "Управление нагревателем",
        cells: {
            "Включить вручную": {
                type: "switch",
                value: false
            },
            "Включить вентилятор вручную": {
                type: "switch",
                value: false
            },
            "Верхний порог температуры": {
                type: "range",
                value: 26,
                max: 40
            },
            "Нижний порог температуры": {
                type: "range",
                value: 23,
                max: 40
            }
        }
    });
   
   
    defineRule("manual_lamp3_control", {
        whenChanged: "lamp3_manual/Включить вручную",
        then: function(newValue, devName, cellName) {
            if (MANUAL_SWITCHER_3_FLAG == false) {
                if (newValue == true) {
                    lamp3_switcher = 1;
                    //dev["lamp3_manual/Включить вентилятор вручную"] = false;
                    //MANUAL_LAMP3_FLAG = true;
                } else {
                    //MANUAL_LAMP3_FLAG = false;
                    lamp3_switcher = 0;
                }
            }
        }
    });
   
   
    defineRule("manual_fan_control", {
        whenChanged: "lamp3_manual/Включить вентилятор вручную",
        then: function(newValue, devName, cellName) {
            if (newValue == true) {
                small_fan_switcher = 1;
                //dev["lamp3_manual/Включить вручную"] = false;
                //MANUAL_FAN_FLAG = true;
            } else {
                small_fan_switcher = 0;
                //MANUAL_FAN_FLAG = false;
            }
        }
    });
   
   
   
   
    defineRule("heater_hysteresis", {
        whenChanged: "wb-mir-simple_10/External Temperature Sensor",
        then: function(newValue, devName, cellName) {
            if (MANUAL_SWITCHER_3_FLAG == false) {
                    if (newValue > dev["lamp3_manual"]["Верхний порог температуры"]) {
                        fan_virtual_switcher = 1;
                        lamp3_virtual_switcher = 0;
                    } else {
                        if (newValue < dev["lamp3_manual"]["Нижний порог температуры"]) {
                            fan_virtual_switcher = 0;
                            lamp3_virtual_switcher = 1;
                        }
                }
            }
        }
    });
</code>
</div></div>


====Имитация затопления====
{| class="wikitable"
<div class="mw-collapsible mw-collapsed">
! colspan="2" |WB-MIR v.2
Код правила
|-
<div class="mw-collapsible-content">
|wb-mir_10/External Temperature Sensor
<code>
|1-wire 3
    defineAlias("light_under_rozetka_1", "wb-gpio/EXT3_HS2");
|}
    defineAlias("light_under_rozetka_2", "wb-gpio/EXT3_HS1");
   
    defineAlias("light_upper_rozetka_1", "wb-mr6c_1/K1");
    defineAlias("light_upper_rozetka_2", "wb-mr6c_1/K2");
   
    defineAlias("rozetka1_control", "wb-mr6c_1/K1");
    defineAlias("rozetka2_control", "wb-mr6c_1/K2");
   
    defineAlias("rozetka1_virtual_control", "rozetkas_controls/Включить розетку 1");
    defineAlias("rozetka2_virtual_control", "rozetkas_controls/Включить розетку 2");
   
    defineAlias("rozetka1_input", "wb-mr6c_1/Input 1");
    defineAlias("rozetka2_input", "wb-mr6c_1/Input 2");
   
    defineAlias("leak_sensor_input", "wb-gpio/MOD2_IN1");
    defineAlias("alarm_button", "wb-gpio/EXT5_DR6");
    defineAlias("light_under_alarm_button", "wb-gpio/EXT3_HS3");
    defineAlias("light_upper_leak_sensor", "wb-gpio/EXT1_R3A1");
   
    var ROZETKA1_FORCE_FLAG = false;
    var ROZETKA2_FORCE_FLAG = false;
   
    var ROZETKA1_BLINKING_FLAG = false;
    var ROZETKA2_BLINKING_FLAG = false;
   
    var ZATOPLENIE_FLAG = false;
   
    defineVirtualDevice("rozetkas_controls", {
        title: "Управление розетками",
        cells: {
            "Включить розетку 1": {
                type: "switch",
                value: false
            },
            "Включить розетку 2": {
                type: "switch",
                value: false
            },
            "Иммитация протечки": {
                type: "switch",
                value: false
            },
            "Частота индикации при аварии": {
                type: "range",
                value: 700,
                min: 600,
                max: 2500
            }
   
        }
    });
   
   
    defineRule("rozetka1_turn_on", {
        whenChanged: "rozetkas_controls/Включить розетку 1",
        then: function(newValue, devName, cellName) {
            if (dev["rozetkas_controls/Иммитация протечки"] == false) {
                if (ROZETKA1_FORCE_FLAG == false) {
                    log("Force flag is false on rozetka 1");
                    rozetka1_control = newValue;
                }
                if (ROZETKA1_FORCE_FLAG == true) {
                    log("Not working");
                }
            }
        }
    });
   
   
   
    defineRule("rozetka1_turnonlight", {
        whenChanged: "wb-mr6c_1/K1",
        then: function(newValue, devName, cellName) {
   
            light_under_rozetka_1 = newValue;
   
   
        }
    });
   
   
   
   
    defineRule("Input1_handler", {
        whenChanged: "wb-mr6c_1/Input 1",
        then: function(newValue, devName, cellName) {
            if (newValue == false) {
                ROZETKA1_FORCE_FLAG = true;
                rozetka1_initial_state = rozetka1_virtual_control;
                rozetka1_control = false;
                log(rozetka1_control);
                rozetka1_virtual_control = false;
                ROZETKA1_BLINKING_FLAG = true;
                startTicker("button_blinking_timer", dev["rozetkas_controls/Частота индикации при аварии"])
                log("Rozetka 1 was ", rozetka1_initial_state, "before poweroff")
            }
            if (newValue == true) {
                log("Power on rozetka 1 is turned on!");
                ROZETKA1_BLINKING_FLAG = false;
                ROZETKA1_FORCE_FLAG = false;
   
                rozetka1_virtual_control = rozetka1_initial_state;
            }
        }
    });
   
   
    defineRule("rozetka2_turn_on", {
        whenChanged: "rozetkas_controls/Включить розетку 2",
        then: function(newValue, devName, cellName) {
            if (dev["rozetkas_controls/Иммитация протечки"] == false) {
                if (ROZETKA2_FORCE_FLAG == false) {
                    log("Force flag is false on rozetka 2");
                    rozetka2_control = newValue;
                }
                if (ROZETKA2_FORCE_FLAG == true) {
                    log("Not working");
                }
            }
        }
    });
   
   
   
    defineRule("rozetka2_turnonlight", {
        whenChanged: "wb-mr6c_1/K2",
        then: function(newValue, devName, cellName) {
   
            light_under_rozetka_2 = newValue;
   
        }
    });
   
   
   
   
    defineRule("Input2_handler", {
        whenChanged: "wb-mr6c_1/Input 2",
        then: function(newValue, devName, cellName) {
            if (newValue == false) {
                ROZETKA2_FORCE_FLAG = true;
                rozetka2_initial_state = rozetka2_virtual_control;
                rozetka2_control = false;
                log(rozetka2_control);
                rozetka2_virtual_control = false;
                log("Rozetka 2 was ", rozetka2_initial_state, "before poweroff")
                ROZETKA2_BLINKING_FLAG = true;
                startTicker("button_blinking_timer", dev["rozetkas_controls/Частота индикации при аварии"])
            }
            if (newValue == true) {
                log("Power on rozetka 2 is turned on!");
                ROZETKA2_FORCE_FLAG = false;
                ROZETKA2_BLINKING_FLAG = false;
   
                rozetka2_virtual_control = rozetka2_initial_state;
            }
        }
    });
   
   
   
    defineRule("leak_sensor_wrapper", {
        whenChanged: "wb-gpio/MOD2_IN1",
        then: function(newValue, devName, cellName) {
   
            if (newValue == true) {
                dev["rozetkas_controls/Иммитация протечки"] = 1;
                light_upper_leak_sensor = 1;
            } else {
                light_upper_leak_sensor = 0;
            }
   
        }
    });
   
   
   
    defineRule("set_alarm_off", {
        whenChanged: "wb-gpio/EXT5_DR6",
        then: function(newValue, devName, cellName) {
   
            if (newValue == true) {
                dev["rozetkas_controls/Иммитация протечки"] = 0;
            }
   
        }
    });
   
   
   
    defineRule("protechka_handler", {
        whenChanged: "rozetkas_controls/Иммитация протечки",
        then: function(newValue, devName, cellName) {
            if (newValue == true) {
                light_under_alarm_button = 1;
   
                ZATOPLENIE_FLAG = true;
                dev["wb-mrgb_4/RGB"] = "255;0;0";
                log(dev["wb-mrgb_4/RGB"]);
                dev["wb-gpio/EXT2_K2"] = true;
                startTicker("button_blinking_timer", dev["rozetkas_controls/Частота индикации при аварии"])
            } else {
   
                light_under_alarm_button = 0;
                dev["wb-gpio/EXT2_K2"] = false;
                ZATOPLENIE_FLAG = false;
                dev["wb-mrgb_4/RGB"] = "0;255;0";
            }
        }
    });
   
    defineRule("blink_buttons", {
        when: function() {
            return timers.button_blinking_timer.firing;
        },
        then: function() {
            if (ZATOPLENIE_FLAG == true) {
                log("Firing!");
                light_under_rozetka_1 = !light_under_rozetka_1;
                light_under_rozetka_2 = !light_under_rozetka_2;
            }
   
            if (ROZETKA2_BLINKING_FLAG == true) {
                light_under_rozetka_2 = !light_under_rozetka_2;
            }
   
            if (ROZETKA1_BLINKING_FLAG == true) {
                light_under_rozetka_1 = !light_under_rozetka_1;
            }
   
            if (ZATOPLENIE_FLAG == false && ROZETKA1_BLINKING_FLAG == false && ROZETKA2_BLINKING_FLAG == false) {
                timers.button_blinking_timer.stop();
            }
        }
    });
</code>
</div></div>

Текущая версия на 22:08, 8 апреля 2022

Демонстрационный стенд, вид спереди
Демонстрационный стенд, вид сзади

Общая информация

Демонстрационный стенд можно посмотреть в нашем офисе.

Подключённые устройства

Modbus устройства
WB-MR6C 6-канальный релейный модуль. Входы типа «Сухой контакт»
WB-MRWL3 Очень мощный 3-канальный релейный модуль. Входы вида «Сухой контакт»
WB-MDM3 3-канальный диммер светодиодных ламп и ламп накаливания 230 В
WB-MRGBW-D 4-канальный диммер светодиодных лент (на дин-рейку). Допустимый ток 3А на канал.

Отдельный канал для управления белыми лентами.

WB-MAP12H Многоканальный счётчик электроэнергии.
WB-MIR v.2 Модуль для управления устройствами посредством ИК сигналов, оснащён входом для температурного датчика.
Датчики
WB-MSW v.3 Универсальный настенный датчик.
WB-MS/THLS Цифровой датчик температуры, влажности, освещённости и звукового давления с двумя входами для подключения 1-Wire датчиков.
WB-MSGR Комбинированный электрохимический датчик газов со встроенным реле.
WB-M1W2 Модуль для заведения двух 1-Wire датчиков в шину RS-485 и их опроса по протоколу Modbus.
Боковые модули ввода/вывода
WBIO-DO-R10A-8 Релейный модуль. До 7А/230В на канал. Идеален для управления освещением/контакторами/моторами.
WBIO-DO-HS-8 Модуль с 8 выходами вида "High Side Switch"
WBIO-DI-WD-14 Универсальный модуль дискретных входов
WBIO-DI-HVD-16 Модуль содержит 16 входов для детектирования высокого напряжения (220В).

Правила

При написании своих правил через движок WB-Rules, важно помнить, что код в правилах выполняется асинхронно.

Если, в привычном понимании, выполнение кода идёт сверху-вниз, то в данном случае, выполнением управляет событийная модель: когда происходит то или иное событие (изменение показаний датчика/срабатывание таймера/нажатие на кнопку), то выполняется соответствующий кусок кода, отвечающий за обработку этого события. Подробнее о работе движка правил и типовых конструкциях обработки событий можно узнать из соответствующей статьи.

Для управления стендом были созданы виртуальные устройства. Логика управления стендом выглядят следующим образом: нажатие на кнопку/переключение в веб-интерфейсе → срабатывание виртуального устройства → выполнение правила.

Схема подключения

Цвета соединений на схеме условные и не совпадают с цветами проводов в устройстве.

SVG Дашборд

В веб-интерфейсе контроллера Wiren Board можно создавать SVG-дашбрды, это позволяет создать интерактивную мнемосхему.

В веб-интерфейсе демонстрационного стенда в режиме реального времени видно положение автоматов, реле, контакторов и нагрузок на стенде. Так же есть возможность переключать реле нажатием на интерактивные области (подсвечены фиолетовым).

SVG мнемосхема

Файлы для скачивания

По ссылкам ниже вы можете скачать схему подключения в форматах
Corel Draw 2018: Demostand.cdr.zip

Corel Draw PDF: Demostand.pdf

SVG мнемосхема: Demostand.svg.zip

Таблицы MQTT Топиков

WBIO-DO-R10A-8
wb-gpio/EXT1_R3A1 Контактор NO: Лампы, Вентиляция, Индикаторы
wb-gpio/EXT1_R3A2 Контактор NC: Розетки
wb-gpio/EXT1_R3A3 Индикатор 1 (Розетка 1)
wb-gpio/EXT1_R3A4 Индикатор 2 (Розетка 2)
wb-gpio/EXT1_R3A5 Индикатор 3
wb-gpio/EXT1_R3A6 Индикатор 4
wb-gpio/EXT1_R3A7 Индикатор 5
wb-gpio/EXT1_R3A8 Вентилятор
WBIO-DO-HS-8
wb-gpio/EXT2_HS1 Подсветка кнопки 1 (Розетка 1)
wb-gpio/EXT2_HS2 Подсветка кнопки 2 (Розетка 2)
wb-gpio/EXT2_HS3 Подсветка кнопки 3
wb-gpio/EXT2_HS4 Подсветка кнопки 4
wb-gpio/EXT2_HS5 Подсветка кнопки 5
WBIO-DI-HVD-16
wb-gpio/EXT3_IN1 Автомат: Розетка 1
wb-gpio/EXT3_IN2 Автомат: Контроллер, Контакторы
wb-gpio/EXT3_IN3 Контактор NO: Лампы, Вентиляция, Индикаторы
wb-gpio/EXT3_IN4 Автомат: Ввод
wb-gpio/EXT3_IN5 Автомат 3\3: Индикаторы
wb-gpio/EXT3_IN6 Автомат 1\3: Лампы
wb-gpio/EXT3_IN7 Автомат 2\3: Вентиляция
wb-gpio/EXT3_IN8 Автомат: Розетка 2
wb-gpio/EXT3_IN9 Напряжение на розетке 2
wb-gpio/EXT3_IN10 Напряжение на розетке 1
WBIO-DI-WD-14
wb-gpio/EXT4_IN1 Кнопка 1
wb-gpio/EXT4_IN2 Кнопка 2
wb-gpio/EXT4_IN3 Кнопка 3
wb-gpio/EXT4_IN4 Кнопка 4
wb-gpio/EXT4_IN5 Кнопка 5
wb-gpio/EXT4_IN6 Выключатель 1
wb-gpio/EXT4_IN7 Выключатель 2
wb-gpio/EXT4_IN8 Выключатель 3
wb-gpio/EXT4_IN9 Датчик движения
WB-MRWL3
wb-mr3_29/K1 Реле Розетки 1
wb-mr3_29/K2 Реле Розетки 2
WB-MDM3
wb-mdm2_2/Channel 1 Лампа 1
wb-mdm2_2/Channel 2 Лампа 2
WB-MR6C
wb-m6с_3/K1 Лампа 3
WB-MAP12H
wb-map12h_42/Ch 1 L1 Автомат: Контроллер, Контакторы
wb-map12h_42/Ch 1 L2 Автомат 1\3: Лампы
wb-map12h_42/Ch 1 L3 Автомат 2\3: Вентиляция
wb-map12h_42/Ch 2 L1 Автомат 3\3: Индикаторы
wb-map12h_42/Ch 2 L2 Автомат: Розетка 1
wb-map12h_42/Ch 2 L3 Автомат: Розетка 2
WB-M1W2
wb-m1w2_72/External Sensor 1 1-wire 2
wb-m1w2_72/External Sensor 2 1-wire 1
WB-MIR v.2
wb-mir_10/External Temperature Sensor 1-wire 3