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

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

Soundbit, добрый день еще раз. Вы видите, что нажатия на клавиши передаются в москитто? Значение контрола меняется и всё такое. Я правильно понимаю, что клавишей с кодом 12 вы хотите переключать switch виртуального устройства сейчас?

Soundbit, не совсем понимаю, что вы хотите… Пока отошлю вас к любимой всеми странице с правилами написания скриптов. Вы ее читали, конечно, но ещё раз, пожалуйста. И, может, ещё и третий! :slight_smile:
При чтении обращайте внимание вот на какой аспект:
Если в правиле прописано выполнение действий при изменении значения контрола виртуального устройства, то вот вам и слежение.
Проясните, короче момент, чего от чего вы хотите добиться?

Текущая наша беседа – тоже кандидат на отдельный топик становится.

Спасибо за оперативный ответ. попробую объяснить что я хочу. как я писал выше правило должно включать устройство получив значение 12, а выключать получив значение 14. в веб интерфейсе значения выводятся, но правила никак на это не реагируют. если я передам значение (12) и перезагружу движок правил service WB-rules restart, то правило отработает своё считав значение (12) из виртуального устройства клавиатуры. но если я просто нажимаю на клавиши клавиатуры и передаю новые значения то реакции никакой. ниже приведу пример:

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

defineRule("key2",
{
when: function () 
{
return dev ["external_keyboard"]["value"] ==14;
},
then: function()
{
dev ["wb-mr14_55"]["K7"] =0;
  }
});

так вот просто нажимая на клавиши в веб интерфейсе значение выводятся а вотт правило не выполняется.

Вот пока что понятно, типа char нет, замените на value (это тип для числовых значений).

Попробуйте.

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

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

что ещё можно сделать? подскажите, пожалуйста, менял разные типы ставил string, char, int. но ничего не помогает.

наверное все же правильно будет
type: "text"

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

Доброго времени.

По идее, правила должны проверяться при каждом получении нового значения по MQTT. Попробуйте добавить отладочный вывод в функции when и then :

log('test');

На самом деле, можно попробовать написать ваше правило немного оптимальней, например, вот так:

defineRule("keys",
{
whenChanged: "external_keyboard/value",
then: function(value, dev, ctrl) {
    if (value == 12) {
       dev ["wb-mr14_55"]["K7"] =1;
    } else if (value == 14) {
       dev ["wb-mr14_55"]["K7"] =0;
    }
}
};

Тогда движок правил не будет запускать функцию when() на каждый чих в MQTT, а будет слушать конкретно ваше устройство, что несколько упростит всем жизнь. Плюс, в этом случае правило не будет реагировать на “зажатую” кнопку.

Ещё выставьте значение по умолчанию для "value" в описании виртуального устройства числом, а не строкой (например, 0).

Попробуйте такую версию. Если не заработает - будем смотреть, что не так.

попробовал. к сожалению никаких результатов.

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


defineRule("keys",
{
whenChanged: "external_keyboard/value",
then: function(value, dev, ctrl)
 {
    if (value == 12)
 {
       dev ["wb-mr14_55"]["K7"] =1;
    }
 else 
if (value == 14)
 {
       dev ["wb-mr14_55"]["K7"] =0;
}
}
});

type не может быть "string". Либо "text", либо "value".

не помогает пробовал “text” и “value”

Есть ещё какие-нибудь мысли? что сделать для работы правил и клавиатуры?

Попробуйте в лог писать value в then и else. Работает ли вообще? Если работает, то попробуйте завести переменную и добавлять к ней единицу и тоже писать эту переменную в лог. Результаты – в студию! :slight_smile:

Здравствуйте! ничего не могу сделать. научите, пожалуйста, как писать в log? всё что мне удалось заметить, что если включить отладку, то файл messages заполняется с невероятной скоростью и найти там что-то полезное не получается. есть какие-то значения связанные с клавиатурой, но ничего поясняющего нет. т.е. например значение 130000.3234452434356. вообщем если можно расскажите пошагово, как писать выводы определённого устройства в log? спасибо!

soundbit, приветствую! В лог писать можно через функцию
log("что-то там");
Читать этот лог можно, нажав на иконку с гаечным ключом внизу справа.
См. рисунок:


Взят скрипт из примера, который в комплекте идет.
Я говорил об отладке в скриптах Wiren Board.

да, действительно, отладка нашлась, но туда ничего не пишется. совсем ничего.:frowning:

Много времени прошло, можете прислать две вещи:

  1. Подпишитесь на топик клавиатуры и пришлите все, что туда у вас падает при нажатии на клавиши (можно на support);
  2. Текст скрипта, который должен писать в лог, но ничего не пишет.

Эх, вот не зря Евгений в самом начале написал, что “Проще всего считать, что нельзя”!

Сергей, все оказалось проще, чем думалось. Не углядели в вашем питоновском скрипте: публикуйте значения, полученные от клавиатуры, не в
/devices/external_keyboard/controls/value
а в
/devices/external_keyboard/controls/value/on — у нас правила отрабатывают только на изменения значений со /on

1 лайк