Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. Скрипт управления замком при помощи iButton (MegaD)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Скрипт управления замком при помощи iButton (MegaD)

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      kID last edited by

      Поскольку MegaD обзавелась замечательной функцией считывания ID ключа iButton и отправки его на сервер, а глубокоуважаемый Bluefox, научил драйвер меги работать с этими данными, я начинаю писать скрипт для управления элктромеханическим замком калитки, управляемым при помощи считывателя EM-Marine.

      Планы тех. задания.

      Необходимо осуществить подачу напряжения на замок на 2 секунды при внесении в пространство считывателя ключа находящегося в файле keys.txt

      При этом в логе должен появляться факт этого действия и принадлежность ключа.

      При внесении в пространство считывателя не зарегистрированного ключа, замок не открывается. В логе фиксируется факт этого события.

      При установленном флаге programming_key, незарегистрированный ключ заносится в файл keys.txt

      Каким образом все это осуществить я пока не знаю, но буду потихоньку изучать javascript :roll:

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

      createState('ibutton.value',0);
      createState('programming_key',"");    
          var idSayIt = "sayit.0.tts.text";
          var volume = 100;
          var lock_port = "megad.0.p1_P1";    // порт электромеханического замка 
          var ibutton = "megad.0.p13_P13";    // порт подключеного iButton
          var programming_key = "";            // признак программирования ключа
      
      on(ibutton, function (obj) {
          log(obj.newState.val);
          if (obj.newState.val !== null){
          setState('ibutton.value', obj.newState.val);
              if (obj.newState.val == '18570c000200'){
              setState (idSayIt, 'Ключ опознан');
              log('открыт замок калитки');
              setState (lock_port, true); 
              setStateDelayed (lock_port, false,5000);
              }else {
              setState (idSayIt, 'неизвестный ключ');}
         log(obj.newState.val);
      }});
      
      1 Reply Last reply Reply Quote 0
      • K
        kID last edited by

        Доделал скрипт согласно описанному тех. заданию

        Получилось следующее:

        `//*********************************************************************************
        // Script purpose:  обслуживание считывателя IButton  для MegaD                         
        // Ver 0.1
        //
        //*********************************************************************************
        // Структура файла ключей: код ключа_1,"принадлежность ключа_1,"код ключа_2,"принадлежность ключа_2" 
        // и т.д
        // Для внесения ключа меняем значение programming_key на true, после чего при касании 
        // ключами они добавляются в файл ключей. 
        // При внесении нового ключа в конец файла добавляется запись код ключа_x,"ключ добавлен" 
        // Далее вручную меняем принадлежность ключа.
        // После ручного редактирования файла надо перезапустить скрипт.
        var lock_port = "megad.1.p6_Откр_калитка";  // порт электромеханического замка 
        var ibutton = "megad.1.a6_P14"/*P14*/;      // порт подключеного iButton
        var file = '/opt/iobroker/keys.txt';        // путь к файлу ключей и его имя
        createState('programming_key', false);      // при false обычное функционирование замка;
                                                    // true добавляем новые ключи
        var idSayIt = "sayit.0.tts.text";           // проговариваем события 
        var volume = 100;
        var fs = require('fs');  // для обработки файловой системы
        var current_key;        // считанный ключ
        var arrayPosition;      // позиция считанного ключа в массиве ключей
        var keys = ['52a817010000','Тестовый ключ'];// можно суда добавить ключи которые вносятся в файл ключей 
                                                    // при его создании
        
        //*********************************************************************************
        function checkKey (key){                        // на входе значения ключа, проверяем есть ли совпадения 
            for (var i=0; i < keys.length; i = i + 2) { // в массиве keys если есть то возращает true 
                    if (key == keys[i]){                
                    arrayPosition = i;                  // дополнительно в arrayPosition индекс этого ключа
                    return true;
                    }    
            }
            return false;
        }
        
        function openDor(arrayPosition){            // активируем замок на 1 сек, проговариваем, и пишем в лог
            setState (idSayIt, 'Входите');
            log("Замок открыт ключом   " + keys[arrayPosition] + " принадлежащим " + keys[arrayPosition+1]);
            setState (lock_port, true); 
            setStateDelayed (lock_port, false,1000);
        }
        
        function storeKeyValue (current_key){                   // записываем новые ключи
             if (checkKey (current_key) === true) {             // проверить есть ли вводимый ключ в базе
                log ("Этот ключ " + current_key + " уже прописан в базе и принадлежит " + keys[arrayPosition+1]); // если ключ есть сообщить об этом 
            } else {                                            
                keys.push (current_key);                        // если ключа нет добавть его в массив
                keys.push("ключ добавлен");                     // создать  поле в следующей клетке массива
                log('добавлен ключ ' + current_key);
                fs.writeFileSync(file, JSON.stringify(keys)); // записать массив на диск
                }    
        }         
        
        function createFile(){
        log("Создаем файл ключей");    
        fs.writeFileSync(file, JSON.stringify(keys));    
        }
        
        //************************ инициализация******************************
        // проверить есть ли файл с кодами ключей
        if (!fs.existsSync(file)) {
            createFile();                               // если нет то создать его
        }
        //  читаем значения из файла кодов и записываем их в массив keys
        keys = JSON.parse(fs.readFileSync(file).toString()); // считаем массив keys
        
        //******************* при считывании ключа ***************************
        on({id:ibutton, change: "any"}, function (obj) {                // при изменнии ibutton
            current_key = obj.newState.val;
            if (getState ('programming_key').val === true) {       // если установлен флаг programming_key то вызываем функцию 
                storeKeyValue(current_key);     // storeKeyValue со значением считаного ключа
            } else 
                if (checkKey (current_key) === true) { 
                openDor(arrayPosition);     
                } else {
                setState (idSayIt, 'доступ запрещен, неизвестный ключ');
                log('неизвестный ключ ' + current_key);
                }
        });`
        
        Еще хочется, чтобы в при нажатии в vis кнопки  добавить ключ, появлялась клавиатура (цифровой блок) и запись ключей была возможна только при наборе верного кода.  Пока застрял на этапе вывода клавиш. Объект добавляется в режиме редактирования, но в обычном  режиме он не виден.[/i]
        
        1 Reply Last reply Reply Quote 0
        • I
          instalator last edited by

          @kID:

          Еще хочется, чтобы в при нажатии в vis кнопки добавить ключ, появлялась клавиатура (цифровой блок) и запись ключей была возможна только при наборе верного кода. Пока застрял на этапе вывода клавиш. Объект добавляется в режиме редактирования, но в обычном режиме он не виден. `

          ! > [{"tpl":"tplKeyboardWidget","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"wname":"w00028","layout":"numpad"},"style":{"left":"0px","top":"0px","position":"","display":""},"widgetSet":"keyboard"},{"tpl":"tplJquiInput","data":{"oid":"nothing_selected","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","label":"Input","digits":"0","size":"10","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false},"style":{"left":"241px","top":"59px","width":"154px","height":"41px"},"widgetSet":"jqui"}]

          1 Reply Last reply Reply Quote 0
          • K
            kID last edited by

            @instalator:

            @kID:

            Еще хочется, чтобы в при нажатии в vis кнопки добавить ключ, появлялась клавиатура (цифровой блок) и запись ключей была возможна только при наборе верного кода. Пока застрял на этапе вывода клавиш. Объект добавляется в режиме редактирования, но в обычном режиме он не виден. `

            ! > [{"tpl":"tplKeyboardWidget","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"wname":"w00028","layout":"numpad"},"style":{"left":"0px","top":"0px","position":"","display":""},"widgetSet":"keyboard"},{"tpl":"tplJquiInput","data":{"oid":"nothing_selected","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","label":"Input","digits":"0","size":"10","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false},"style":{"left":"241px","top":"59px","width":"154px","height":"41px"},"widgetSet":"jqui"}] `

            Спасибо. Понял что должно быть тестовое поле, куда осуществляется ввод. Поле можно скрыть.

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

            Я правильно понимаю или слишком наворачиваю ?

            1 Reply Last reply Reply Quote 0
            • I
              instalator last edited by

              @kID:

              @instalator:

              @kID:

              Еще хочется, чтобы в при нажатии в vis кнопки добавить ключ, появлялась клавиатура (цифровой блок) и запись ключей была возможна только при наборе верного кода. Пока застрял на этапе вывода клавиш. Объект добавляется в режиме редактирования, но в обычном режиме он не виден. `

              ! > [{"tpl":"tplKeyboardWidget","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"wname":"w00028","layout":"numpad"},"style":{"left":"0px","top":"0px","position":"","display":""},"widgetSet":"keyboard"},{"tpl":"tplJquiInput","data":{"oid":"nothing_selected","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","label":"Input","digits":"0","size":"10","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false},"style":{"left":"241px","top":"59px","width":"154px","height":"41px"},"widgetSet":"jqui"}] `

              Спасибо. Понял что должно быть тестовое поле, куда осуществляется ввод. Поле можно скрыть.

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

              Я правильно понимаю или слишком наворачиваю ? `
              Правильно, клавиатура навешивается на виджет инпут

              1 Reply Last reply Reply Quote 0
              • H
                hawkeye last edited by

                Отличный скрипт! Сейчас сообразить бы как его себе приспособить.

                На том дело и встало или есть прогресс?

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                1.1k
                Online

                31.7k
                Users

                79.7k
                Topics

                1.3m
                Posts

                3
                6
                3045
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo