Управление выключателем (кнопкой)



  • @intrapro:

    @chas99:

    уважаемые разработчики iH, Хотелось бы иметь механизм создания подобных сценариев 😉

    Сделать можно, написав немного скриптов 🙂

    ..

    Но, используя механизм сценариев, сделать можно все что угодно:

    1. Для бинарного датчика реализуем поведение "Кнопка" с помощью шаблонного сценария, который создаст свойство pressed и будет присваивать значения:

    1 - при коротком нажатии, 2 - при двойном нажатии, 3 - при длинном нажатии

    ..

    Такой сценарий мы сделали и включили в обновление.

    Он будет появляться при нажатии на кнопку "Поведение" для "Дискретного универсального датчика" (тип=100).

    Времена сейчас такие: до 1 сек - короткое нажатие, интервал между кликами для двойного - тоже 1 сек.

    При желании можно в файле поменять времена, поэкспериментировать… Файл /opt/intrahouse/server/scenpat/fm_butpress.pat

    Можно создать свой шаблон и сохранить под другим именем (кроме имени файла, обязательно поменять и patname), иначе он перезапишется при обновлении.

    я правильно понимаю, что такой скрипт уже есть в iH ? вот он…
    2017-01-19_210215.jpg

    @intrapro:

    2. Теперь хотелось бы выполнять разные действия при разных нажатиях, например:

    Будем LAMP1 переключать при коротком нажатии, LAMP2 - при двойном, а при длинном мы оба светильника выключим. Все свои действия запишем в журнал.

    Для этого напишем сценарий, который работает по событию BUTTON1.pressed

    > {
    >     "scenname": "mybut1",
    >     "note": "Сценарии кнопки BUTTON 1",
    >     
    >     "start": {
    >         "event": "BUTTON1",
    >         "if": "(BUTTON1.pressed > 0)"
    >     },
    >     
    >     "functions": {
    >         "start": [
    >             { "if": "BUTTON1.pressed == 1",
    >              	 "exec": { "do": "LAMP1.toggle", "wri": "Короткое нажатие, переключить LAMP1"}  },
    >             { "if": "BUTTON1.pressed == 2", 
    >             	 "exec": { "do": "LAMP2.toggle", "wri": "Двойное нажатие,  переключить LAMP2"}  },
    >             { "if": "BUTTON1.pressed == 3", 
    >             	 "exec": { "do": "LAMP1.off,LAMP2.off", "wri": "Длинное нажатие, выключить LAMP1 и LAMP2" }  },
    >             {"exec": {"do": "BUTTON1.pressed:0" }  }
    >         ]
    >     }
    > }
    > 
    > 
    

    Действия устройств: on - включить, off - выключить, toggle - переключить.

    Это уже не шаблонный сценарий, который можно применять к различным устройствам, а обычный базовый сценарий, в нем используются имена устройств конкретного проекта, хранятся такие сценарии в папке /opt/intrahouse/base/scenbase.

    Если сценарий лежит в папке scenbase, он загружается при старте системы и будет выполняться без всяких привязок.

    Файл можно загрузить и просмотреть через интерфейс: PM->Сценарии/ Скрипты/ Скрипты проекта, но редактировать пока нельзя. В ближайшем времени будет добавлен новый формат для сценариев с использованием синтаксиса JavaScript, но пока это голый JSON и в принципе легко ошибиться, не поставив кавычки или запятую.

    При интерактивной загрузке выполняется проверка на валидность JSON формата, не валидный файл не загружается.

    Проверить синтаксис JSON можно разными способами, в т.ч. online

    Я скопировал ваш код в файл test.json и загрузил его в iH, и он в системе
    2017-01-19_210806.jpg
    правильно я сделал?

    но у меня не заработало! я предполагаю, что в сценарии BUTTON1.pressed используется BUTTON1, а у меня в устройствах нет такого ID

    а у меня кнопка SENSOR1
    2017-01-19_211140.jpg

    Скажите пожалуйста, что я делаю не правильно?



  • @chas99:

    но у меня не заработало! я предполагаю, что в сценарии BUTTON1.pressed используется BUTTON1, а у меня в устройствах нет такого ID а у меня кнопка SENSOR1

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

    Сейчас есть два решения:

    1. Отредактировать файл test.json, заменив BUTTON1 на SENSOR1, после этого перезагрузить сервер (сценарии проекта сейчас загружаются на старте сервера).

    2. Создать новое устройство, назвать его BUTTON1, т.к. изменить ID устройства можно только при его создании, и привязать шаблонный сценарий "Нажатие кнопки" к нему.

    P.S. Идея " ЧАВО (FAQ) для новичка" очень правильная и своевременная, постараемся в ближайшем времени начать публикацию.



  • @intrapro:

    @chas99:

    но у меня не заработало! я предполагаю, что в сценарии BUTTON1.pressed используется BUTTON1, а у меня в устройствах нет такого ID а у меня кнопка SENSOR1

    Уважаемый chass99, извините за задержку с ответом 🙂

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

    Сейчас есть два решения:

    1. Отредактировать файл test.json, заменив BUTTON1 на SENSOR1, после этого перезагрузить сервер (сценарии проекта сейчас загружаются на старте сервера).

    2. Создать новое устройство, назвать его BUTTON1, т.к. изменить ID устройства можно только при его создании, и привязать шаблонный сценарий "Нажатие кнопки" к нему.

    P.S. Идея " ЧАВО (FAQ) для новичка" очень правильная и своевременная, постараемся в ближайшем времени начать публикацию.

    Ок, спасибо! Заменю, а что дальше ?

    Хватит этих двух скриптов/сценариев? По идее нужно ведь ещё привязать ЛАМПЫ к этой кнопке, создав сценарий (PM - сценарии - по событиям устройств), так? А как настроить обработку двойного нажатия и длинного?



  • @chas99:

    Хватит этих двух скриптов/сценариев? По идее нужно ведь ещё привязать ЛАМПЫ к этой кнопке, создав сценарий (PM - сценарии - по событиям устройств), так? А как настроить обработку двойного нажатия и длинного?

    Обычно сценарий можно создать двумя способами - через интерфейс (PM - сценарии - по событиям устройств) или написать скрипт в виде файла.

    Через интерфейс можно только обработать стандартное событие (нажато-отжато), а мы хотим нестандартное 🙂

    Именно поэтому мы написали скрипт, который вы сохранили как test.json и загрузили в систему.

    То есть сценарий по событию создавать НЕ НАДО, вместо него управлять лампами будет скрипт. Посмотрим, как его поменять для себя.

    Скрипт стартует, когда шаблонный сценарий "Нажатие кнопки" определил, как именно нажата кнопка и установил свойство BUTTON1.pressed

     "start": {
            "event": "BUTTON1",
            "if": "(BUTTON1.pressed > 0)"
        },
    
    
    

    Здесь ничего менять не надо.

    Дальше будут выполняться действия.

    Здесь и нужно прописать то, что вы хотите получить при разных нажатиях BUTTON1.pressed (1-короткое, 2-двойное, 3-длинное).

                { "if": "BUTTON1.pressed == 1",
                     "exec": { "do": "LAMP1.toggle", "wri": "Короткое нажатие, переключить LAMP1"}  },
    
    
    

    Для отладки делается запись в журнал ("wri") - это должно работать, если оба сценария подключены. Посмотрите, есть ли записи в журнале при нажатиях. Потом можно будет это убрать.

    "do": - определяет, что нужно включить.

    Сейчас по короткому нажатию переключается LAMP1, по двойному нажатию переключается LAMP2, по длинному обе выключаются.

    Если у вас в проекте есть LAMP1 и LAMP2 - это должно работать.

    Файл скрипта можно отредактировать любым текстовым редактором, который не добавляет разметку, например, "Блокнот" в Windows и заново загрузить.

    Замените строки внутри do на свои команды, например

    "do": "RELE1.on" - включить

    "do": "VENT3.off" - выключить

    "do": "LAMP8.toggle" - переключить

    Если нужно выполнить несколько действий, они перечисляются через запятую

    "do": "LAMP1.off,LAMP2.on"

    Помните, что после редактирования файла сценария требуется перезагрузка сервера intrahouse (кнопка Перезагрузить в PM - Система - Параметры запуска сервера).

    Или из консоли:

    sudo service intrahouse stop
    sudo service intrahouse start
    
    
    


  • @chas99:

    у меня добавление к предложению http://intrahouse.eu/forum/viewtopic.php?f=7&t=43

    давайте ВМЕСТЕ делать " ЧАВО (FAQ) для новичка" или HOW-TO, с примерами решения конкретных ситуаций, чтобы любой желающий/начинающий разбираться с iH мог воспользоваться подготовленными решениями!!!

    давайте, дорешаем с этой темой, а решение там опубликуете 8-)

    Чтобы любой мог начать знакомство с iH подключив пару СветоДиодов и пару кнопок к Raspberry и настроить управление их взаимодействие, попробовав разные сценарии… :idea:

    Спасибо! Предложение принимается 🙂



  • @intrapro:

    2. Создать новое устройство, назвать его BUTTON1, т.к. изменить ID устройства можно только при его создании, и привязать шаблонный сценарий "Нажатие кнопки" к нему.

    выбрал вариант 2. предложенный вами 😃

    создал по новой -

    1.добавил устройство "Датчик бинарный - Датчик универсальный два состояния" с ID BUTTON1

    2.[Поведение] добавил Шаблон сценария - "Нажатия кнопки (Короткое, длинное, двойное)"

    3.[Железо] привязал к GPIO21, Тип канала "Дискретный вход с подтяжкой pull_up", Инвертировать значение - вкл

    в результате - Ура, заработали и кнопка и лампочки!!! :!:

    но вылез проклятый "дребезг контактов" 😞 Подскажите, пожалуйста, как с ним бороться?

    для примера "длинное нажатие" нажал на кнопку и отпустил через пару секунд, а вот что записалось в журнале…
    2017-01-22_135213.jpg
    Причем если посмотреть Отладчик - Устройства - Монитор BUTTON1 - то там отображается 0, а при нажатии 1, и нет мерцания "дребезга контактов"…



  • @intrapro:

    Обычно сценарий можно создать двумя способами - через интерфейс (PM - сценарии - по событиям устройств) или написать скрипт в виде файла.

    Через интерфейс можно только обработать стандартное событие (нажато-отжато), а мы хотим нестандартное 🙂

    Именно поэтому мы написали скрипт, который вы сохранили как test.json и загрузили в систему.

    То есть сценарий по событию создавать НЕ НАДО, вместо него управлять лампами будет скрипт. Посмотрим, как его поменять для себя.

    ….

    СПАСИБО за развернутый ответ!

    оказывается всё довольно легко и просто (когда понимаешь) 😄



  • Надеюсь поможет эта информация в борьбе с "дребезгом контактов"

    Вот логи через Отладчик - Scene Server - Загрузка, старт/стоп сценариев

    Это одиночное нажатие кнопки
    2017-01-22_144255.jpg

    Это двойное
    2017-01-22_144320.jpg

    Это длинное
    2017-01-22_144356.jpg



  • У вас еще работают сценарии по событиям LAMP1 и LAMP2. Что они делают?



  • да, сделал на пробу два сценария, чтобы автоматом выключались лампы, LAMP1 через минуту после включения, LAMP2 через 10сек :oops:

    сценарии РАБОТАЮТ!

    Лампы выключаются через заданные интервалы, причем не зависимо как включать через физическую кнопку или мышкой на экране…



  • Как у вас проявляется дребезг? В логах не видим.



  • @intrahouse:

    Как у вас проявляется дребезг? В логах не видим.

    Проявляется - лампочки не понятно как срабатывают 😞 по крайней мере не так и не всегда как задумано, одно, двойное , длинное нажатие….



  • Попробуйте убрать все сценарии по событию для LAMP1 и LAMP2 и повторить эксперимент



  • Пробовал… То же самое...



  • Завтра проверим на работе



  • Хорошо, только кнопку подключите напрямую к raspberry



  • Проверили. На разных кнопках. И нашли кнопку где дребезг есть. Собственно это не кнопка, просто замыкал два проводочка.

    А раз есть, надо его убирать.

    Сделаем обработку дребезга на уровне плагина.

    О результате сообщу.





  • заменил кнопку, на другую, работать стало гораздо лучше 😉

    логика работы не много не устраивает!

    двойное нажатие зажигает сразу LAMP2, а вот одиночное нажатие - LAMP1 зажигается с задержкой ~2сек! не удобно…

    хотел поиграть с настройкой таймеров - fm_butpress.pat

      "timers":[
          {"name":"T1","interval":"1",  "call":"ontimer1"},
          {"name":"T2","interval":"1",  "call":"stop"}
    
    

    изменил на "1" на "0.1", но сохранить изменения не могу - Permission Denied

    подскажите, пожалуйста, как изменить и таймер и сохранить?

    я хочу поэкспериментировать с задержками…



  • не дождался ответа, пришлось самому разбираться :ugeek:

    сделал так, вместо 1 поставил 0.05

     "timers":[
          {"name":"T1","interval":"0.05",  "call":"ontimer1"},
          {"name":"T2","interval":"0.05",  "call":"stop"}
    
    
    

    стало быстрее реагировать!


Авторизуйтесь, чтобы ответить