Usb клавиатура и wirenboard

Здравствуйте! возможно ли вообще как-то работать с usb клавиатуры на wirenbord 5? если знать на каком этапе находится контролер при загрузке? если знать где находится курсор при загрузке, то можно набирать команды прямо с клавиатуры. но вот как узнать что там? как попасть в консоль? поясните! спасибо!

Проще всего считать, что нельзя.

т.е. в консоль никак с клавиатуры не попасть?

А в какую консоль, вот в чем вопрос? Впрочем, комбинации Ctrl-Alt-Del и некоторые Alt-Sys-Rq-… сработают с подключенной в USB-порт клавиатуры. Но зачем? :slight_smile: А тыкать вслепую в клавиатуру что-то уж очень вообще совсем никак не фен-шуй.

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

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

Ну, смотрите, любая подключенная клавиатура будет сыпать скан-коды клавиш в /dev/input/event1. Какой-нибудь демон может читать этот /dev/input/event1, и творить, что вам угодно, с программируемой клавиатурой в том числе. Но работа в консоли предполагает интерактивный режим, вы же должны видеть, что вам отвечает система на ваши команды?

Как вариант – есть всякие клавиатуры rs-485 и возможность выполнения скриптов в Wiren Board.
Если не секрет, что вы хотите таким образом сделать?

я хочу сделать пульт управления системой в котором собрать все команды для управления. в качестве пробного варианта взял программируемую кассовую клавиатуру posua mxx 64. на компьютере программируешь на клавишу 256 символов. Вот я бы и хотел прикрутить это к wirenboard. видел клавиатуры с rs-485, но как с ней работать в системе правил? Если есть пути решения вопроса, подскажите, пожалуйста!

Пути решения вопроса есть всегда: как бы цинично это не звучало, но самый правильный путь в вашем случае — платная поддержка.
Вы как хоббист-энтузиаст это делаете или это коммерческий проект? Вам, как энтузиасту, могу указать путь (возможно, неоптимальный), как и что делать с вашей клавиатурой (а дальше – сами). А готовое и проверенное коммерческое решение, конечно, стоит денег (и зависит от планов руководства компании).

Я тоже после статьи на Хабре взял себе программируемую кассовую клавиатуру :slight_smile: , все никак руки не дойдут что-то путное из нее сделать.

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

ну и я был бы очень благодарен, если бы Вы указали, мне как энтузиасту что делать! :slight_smile:

А какой сценарий использования? Зачем нужна клавиатура, если нет “монитора”?

Но программировать придется! :slight_smile:

Смотрите, за основу берем скрипт пользователя gatorback (второй пост) get-a-string-from-hid-device-in-python-with-evdev.

У вас на Wiren Board не установлена библиотека python-evdev. Бинарника я не нашел, поэтому ставим много чего командой apt-get install python-dev python-pip

Затем ставим python-evdev: pip instal evdev

В программе из примера заменяем последнюю строку на

os.system("mosquitto_pub -t /devices/external_keyboard/controls/value -m " + format(key_lookup))

и dev = InputDevice(’/dev/input/event1’)
меняем на dev = InputDevice(’/dev/input/event0’) (проверьте)

Теперь создаем виртуальное устройство ни самом WirenBoard в разделе Scripts:

external_keyboard.js

    title: "Get symbol from external keyboard",
    cells: {
	enabled: {
	    type: "switch",
	    value: true
	},
      value: {
        type: "char",	
        value: ""
      		}
    }
});

В командной строке запускаем питоновский скрипт, и на вкладке Devices наблюдаем за полем value устройства “Get symbol from external keyboard” – там, если все получилось, должны отображаться символы, соотв. клавишам, которые вы нажимаете на клавиатуре.

В питоновском скрипте можете менять таблицу трансляции, а в правилах задавать defineRule с условием whenChanged см. Движок описание движка правил. Как-то так. Если все заработает, то питоновский скрипт поместите в автозагрузку.

1 Like

Большое спасибо! Буду пробовать!

не большое уточнение. если бы это была клавиатура с RS-485, то напрямую в движок правил возможно ли передавать параметры без участия программы на python?

Да не за что!

Есть у меня подозрение, что такие RS-485-клавиатуры, если они и поддерживают Modbus, сами выступают в роли мастера, а мастер у нас уже есть – сам Wiren Board. А клавиатура-slave должна где-то накапливать в буфере нажатые клавиши, а мастер должен их периодически считывать – тут программировать тоже придется в движке правил. Поищите на просторах интернета, вдруг чего стоящее есть.

Если надежность работы python-скрипта вызывает подозрения, можно в движке правил вставлять звуковые сигналы подтверждения нажатия клавиши или выполнения нужной команды. Но, конечно, “колхозность” решения торчит своими ушами отовсюду. А так, по-хорошему, надо собрать программистов, написать HID-драйвер для WirenBoard, но это как раз то коммерческое решение, о котором я говорил.

С третьей стороны, если у вас для вас будет всё работать, то какая разница! Только кнопок очень много…

а что должно отображаться в командной строке при запуске скрипта? у меня выводит следующее.

Python 2.7.3 (default, Jun 21 2016, 20:38:54)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information ```
так и должно быть? в начало питоновского скрипта поместил строку: 
/usr/bin/env python 

пока неудалось считать информацию с клавиши. поле value пустое.

помогите, пожалуйста, уже долго бьюсь над этой проблемой. что-то не так?

#!/usr/bin/python3
import evdev
from evdev import InputDevice, categorize, ecodes  
dev = InputDevice("/dev/input/event0")

# Provided as an example taken from my own keyboard attached to a Centos 6 box:
scancodes = {    # Scancode: ASCIICode    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 
9: u'8',    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 
19: u'r',    20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 
28: u'CRLF', 29: u'LCTRL',    30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 
36: u'j', 37: u'k', 38: u'l', 39: u';',    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 
44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',    50: u'm', 51: u',', 52: u'.', 
53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}

capscodes = {    
0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 
9: u'*', 10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 
27: u'}', 28: u'CRLF', 29: u'LCTRL',    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 
35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',    
40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 
49: u'N', 50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}
#setup vars
x = ''
caps = False

#grab provides exclusive access to the device
dev.grab()

#loop
for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        data = categorize(event)  # Save the event temporarily to introspect it
        if data.scancode == 42:
            if data.keystate == 1:
                caps = True
            if data.keystate == 0:
                caps = False
        if data.keystate == 1:  # Down events only
            if caps:
                key_lookup = u'{}'.format(capscodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            else:
                key_lookup = u'{}'.format(scancodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            if (data.scancode != 42) and (data.scancode != 28):
                x += key_lookup  
            if(data.scancode == 28):
                print x          # Print it all out!
import os
os.system("ls -all")

os.system("mosquitto_pub -t /devices/external_keyboard/controls/value -m" +format(key_lookup))

выводит такое сообщение:
line 8
9: u’8’, 10: u’9’, 11: u’0’, 12: u’-’, 13: u’=’, 14: u’BKSP’, 15: u’TAB’,
16: u’q’, 17: u’w’, 18: u’e’,
^
SyntaxError: invalid syntax

что делать?

Добрый день, soundbit!

Там пара ошибок, замените #!/usr/bin/python3 на #!/usr/bin/python в начале скрипта,
а строку 8 злосчастную оформите так:

scancodes = {    # Scancode: ASCIICode    
0: None,

вместо
scancodes = { # Scancode: ASCIICode 0: None,

И будет вам счастье!
Но, сами понимаете, по программированию на Пайтон мы не консультируем. Это как бы слегка оффтопик.

1 Like

как победить такое???
создал правило и при помощи клавиатуры передаю значение в виртуальное устройство, а оно должно запускать правило, но… в web интерфейсе значения обновляются но правило не запускается, причём если перезапустить движок правил с этими значениями то значение в правило передаётся. привожу ниже код:

defineVirtualDevice("external_keyboard", 
{
    title: "Get symbol from external keyboard",
    cells: {
	enabled: {
	    type: "switch",
	    value: true
	},
      value: {
        type: "char",	
        value: ""
      		}
    }
});

defineRule("key1",
{
when: function () 
{
return dev ["external_keyboard"]["value"] ==12;
},
then: function()
{
dev ["wb-mr14_55"]["K7"] =1;
  }
});

заранее спасибо!