NEWS
Скрипт управления замком при помощи iButton (MegaD)
-
Поскольку 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); }});
-
Доделал скрипт согласно описанному тех. заданию
Получилось следующее:
`//********************************************************************************* // 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]
-
@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"}]
-
@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. Тогда вываливается клавиатура, на ней набираем код который обрабатывается скриптом прикрепленным к клавиатуре.
Я правильно понимаю или слишком наворачиваю ?
-
@kID:@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. Тогда вываливается клавиатура, на ней набираем код который обрабатывается скриптом прикрепленным к клавиатуре.
Я правильно понимаю или слишком наворачиваю ? `
Правильно, клавиатура навешивается на виджет инпут -
Отличный скрипт! Сейчас сообразить бы как его себе приспособить.
На том дело и встало или есть прогресс?