Умная калитка

Всем здрасти.

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

Логика: подхожу к калитке, датчик сработал включил подсветку, через минуту выключил если отсутствует движение. С 20:00 до 5:00 В остальное время не реагирует.

Нажимаю кнопку срабатывает звонок(нажал сработал нажал сработал). Но при нажатии длинный два коротких открылся замок.

Освещение дорожки включается при первом нажатии кнопки звонка на 10 минут с 20:00 до 5:00 в остальное время не включается.

Как это реализовать с контроллером WB8 и реле MR6C?

С чего начать, сколько правил создавать и как написать?

Здравствуйте! Я — автоматический помощник техподдержки Wiren Board.
Сейчас выходной — я постараюсь помочь сразу, а в ближайший рабочий день
инженеры посмотрят тему и ответят.

Задачу удобно разделить на три правила wb-rules, а не делать одно большое:

  1. Датчик движения → уличная подсветка
    При срабатывании датчика включать фонарь и запускать таймер на 60 секунд. При новом движении таймер запускать заново. Если движение исчезло и таймер истёк — выключать фонарь. Всё правило дополнительно ограничить временем с 20:00 до 05:00.

  2. Кнопка → звонок и освещение дорожки
    Для короткого нажатия включать звонок на заданное время. При первом нажатии в период 20:00–05:00 включать освещение дорожки на 10 минут. Для различения короткого, двойного и длинного нажатия можно использовать счётчики типов нажатий MR6C — похожий пример есть в примерах правил wb-rules.

  3. Длинное + два коротких нажатия → электромагнит
    Это лучше реализовать как последовательность состояний: длинное нажатие переводит правило в режим ожидания, затем два коротких нажатия в течение, например, 3–5 секунд открывают замок. После открытия электромагнит отключать таймером. Само описание «длинный два коротких» нужно уточнить: длинное нажатие должно быть первым, затем два коротких?

Перед написанием готового правила нужны точные MQTT-имена каналов. На WB8 выполните:

cat /etc/wirenboard-release

И пришлите:

  • модель и релиз прошивки WB8;
  • MQTT-имя входа кнопки, входа датчика движения и выходов MR6C для звонка, замка, уличной подсветки и дорожки;
  • тип MR6C и его режим входа: видны ли там Single Press Counter, Double Press Counter, Long Press Counter.

Проверить названия можно в веб-интерфейсе контроллера или командой:

mosquitto_sub -v -t "/devices/#" -C 30

Для датчика, который размыкается при срабатывании, потребуется инвертировать условие в правиле либо включить инверсию входа. Похожий вопрос по подключению нормально замкнутых датчиков к MR6C обсуждался в теме «Подключение датчиков движения к модулю MR6C».

Здесь может понадобиться мнение инженера Wiren Board. Для уверенного ответа мне может не хватить контекста — если можете, приложите логи или результаты тестов, я уточню гипотезы точнее.

Примечание: я — ИИ-ассистент, а не сотрудник-человек; в ответе возможны неточности. Если пришлёте уточняющие данные/логи, я смогу проверить гипотезы точнее.

Wiren Board8 релиз stable модель wb-2606 версия 8.5.3

Добрый день!

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

В первую очередь, я бы провел ревезию сигналов. Если я правильно понял, то у вас из оборудования WB есть только контроллер и реле MR6C. Значит, необходимо составить таблицу ввода/вывода, какой канал контроллерной сборки у вас будет за что отвечать. Например, вот такую:

# Устройство Канал Направление Сигнал
1 WB-MR6C IN1 Вход Кнопка калитки
2 WB-MR6C IN2 Вход Датчик движения
3 WB-MR6C K1 Выход Подсветка калитки
4 WB-MR6C K2 Выход Освещение дорожки
5 WB-MR6C K3 Выход Звонок
6 WB-MR6C K4 Выход Электромагнит замка

Все входы и выходы у нас будут находится на реле, логика - на контроллере. Имейте в виду, что последовательность “длинный-короткий-короткий” модулем на распознается, он может только “короткое”, “длиное”, “двойное”, “короткое-длиное”. Будет проще взять для работы “короткое-длиное”, чем “городить” решение на скриптах.

Второй шаг - выделить и структурировать алгоритмы. Мое предложение:

  1. Датчик движения сработал ночью (20:00–5:00) → включается подсветка калитки. Если движения больше нет — через минуту подсветка гаснет сама. Днём датчик ничего не включает.
  2. Нажал кнопку → срабатывает звонок. Так на каждое нажатие, в любое время суток.
  3. Первое нажатие кнопки ночью (20:00–5:00) → включается освещение дорожки на 10 минут. Если нажать ещё раз, пока дорожка уже горит — ничего не происходит, повторно не включается и таймер не сбрасывается. Днём кнопка дорожку не включает.
  4. Особая комбинация — длинное нажатие, потом два коротких подряд (с паузой между нажатиями не больше 1.5 секунды) → открывается замок калитки. Работает в любое время суток. Если между нажатиями пауза больше 1.5 секунды — комбинация не засчитывается, нужно начинать заново.

Третий шаг - реализация. И тут есть два пути. Первый - самообрзазование. Много читать, много пробовать, будет весело, но далеко не сразу, вначале будет больно, как любят говорить программисты. Если хотите сделать сами, то начните вот с этим ссылок:

  1. Движок правил wb-rules - Wiren Board — что такое wb-rules и с чего начать.
  2. wb-rules/README.md at master · wirenboard/wb-rules · GitHub — справочник по всем функциям (defineRule, таймеры и т.д.).
  3. Примеры правил - Wiren Board — готовые примеры кода, в том числе с распознаванием нажатий.
  4. https://learn.javascript.ru — учебник JS с нуля, если новичок не писал на JS вообще.

Второй путь - открывайте гугл, запускайте режим ИИ, говорите, что вы хотите написать скрипты для Wiren Board, отдаете ему список сигналов и поочередно алгоритмы. Я сейчас проверил, “гуголь” дает вполне себе вменяемый результат. Не факт, что все заработает с первого раза, но как правило вторая-третья итерация уже рабочая, а дальше можно делать эти итерации до бесконечности, что-то меняя или улучшая… как говорили программисты в древности - “полировать глюкало” )

Благодарю, ценное сообщение!

День добрый, Александр, подскажите мне.
Я решил задачу, кроме одного пункта. Освещения дорожки в вечернее и ночное время.
Как мне поступить, вписать в существующий скрипт или создать новый?
У меня два отдельных скрипта. Один для подсветки с датчиком движения, второй для кнопки со звонком и звонком.

Добрый день! Мало контекста, чтобы понять. ) Вы говорите, у вам два скрипта. Опишите, какую из выделенных выше задач решает каждый из них? Можете просто прислать их текстовку. И дополните задачу. Что значит освещение в ночное время? Освещение по датчику движения? Освещение по кнопке?

Нажимаю кнопку срабатывает звонок(нажал сработал нажал сработал). Но при нажатии длинный два коротких открылся замок.

Освещение дорожки включается при первом нажатии кнопки звонка на 10 минут с 20:00 до 5:00 в остальное время не включается.

var button_press_start_time = null;
var timer_k2_id = null;
var timer_k3_id = null;
var click_wait_timer = null;
var long_press_check_timer = null;

// Настройки времени (в миллисекундах)
var DOUBLE_CLICK_DELAY_MS = 400; // Сколько ждать второго нажатия (0.4 сек)
var LONG_PRESS_THRESHOLD_MS = 300; // Длина удержания для замка (0.3 сек)

defineRule(“button_call_handler”, {
whenChanged: “wb-mr6c_47/Input 2”,
then: function (newValue, devName, cellName) {

    // 1. Кнопку НАЖАЛИ (вход замкнулся)
    if (newValue === true) {
        
        // Если мы ждали второе нажатие, и оно произошло в пределах 400 мс
        if (click_wait_timer) {
            clearTimeout(click_wait_timer);
            click_wait_timer = null;
            
            // Запускаем таймер проверки длины удержания (300 мс)
            long_press_check_timer = setTimeout(function () {
                long_press_check_timer = null;
                
                // --- Условие выполнено: Второе нажатие удерживали 300 мс -> Включаем K3 (замок) ---
                log("Вызов: Короткий + Длинный клик (удержание >300 мс)! Включаем K3 на 20 сек.");
                dev["wb-mr6c_47/K3"] = true;
                
                if (timer_k3_id) clearTimeout(timer_k3_id);
                timer_k3_id = setTimeout(function () {
                    dev["wb-mr6c_47/K3"] = false;
                    timer_k3_id = null;
                }, 20 * 1000);
                
            }, LONG_PRESS_THRESHOLD_MS);
        }
    }
    
    // 2. Кнопку ОТПУСТИЛИ (вход разомкнулся)
    if (newValue === false) {
        
        // Если кнопку отпустили раньше, чем истекли 300 мс длинного нажатия:
        if (long_press_check_timer) {
            clearTimeout(long_press_check_timer);
            long_press_check_timer = null;
            log("Вызов: Второе нажатие было слишком коротким (меньше 300 мс). Игнорируем.");
            return; 
        }
        
        // Проверяем: если сейчас активен таймер замка К3, значит замок уже включился, 
        // и это просто отпускание кнопки после длинного удержания. Ничего не делаем.
        if (dev["wb-mr6c_47/K3"] === true) {
            return;
        }
        
        // Если это самое первое отпускание кнопки, запускаем паузу ожидания второго клика
        click_wait_timer = setTimeout(function () {
            click_wait_timer = null;
            
            // --- Второго нажатия не последовало -> Включаем K2 (звонок) ---
            log("Вызов: Одиночный короткий клик! Включаем K2 на 10 сек.");
            dev["wb-mr6c_47/K2"] = true;
            
            if (timer_k2_id) clearTimeout(timer_k2_id);
            timer_k2_id = setTimeout(function () {
                dev["wb-mr6c_47/K2"] = false;
                timer_k2_id = null;
            }, 10 * 1000);
            
        }, DOUBLE_CLICK_DELAY_MS);
    }
}

});

Условие по времени как лучше, сюда вписывать или новое правило создавать?

Я бы условие по времени вписывал в существующий скрипт.

Я ответил на ваши вопросы?

День добрый. У меня с каждым взаимодействием с вашей продукцией возникает очень много вопросов. Так что я даже затрудняюсь ответить)))

При возникновении вопросов вы всегда можете задать их тут, на портале технической поддержки ) Удачи в ваших начинаниях!