Уважаемый Kilpio, если возможно натолкните как сделать так, чтобы правило опрашивало виртуальное устройство? я так понимаю оно считывает данные только во время загрузки? может надо куда-то что-то прописать? спасибо!
Soundbit, добрый день еще раз. Вы видите, что нажатия на клавиши передаются в москитто? Значение контрола меняется и всё такое. Я правильно понимаю, что клавишей с кодом 12 вы хотите переключать switch виртуального устройства сейчас?
Soundbit, не совсем понимаю, что вы хотите… Пока отошлю вас к любимой всеми странице с правилами написания скриптов. Вы ее читали, конечно, но ещё раз, пожалуйста. И, может, ещё и третий!
При чтении обращайте внимание вот на какой аспект:
Если в правиле прописано выполнение действий при изменении значения контрола виртуального устройства, то вот вам и слежение.
Проясните, короче момент, чего от чего вы хотите добиться?
Текущая наша беседа – тоже кандидат на отдельный топик становится.
Спасибо за оперативный ответ. попробую объяснить что я хочу. как я писал выше правило должно включать устройство получив значение 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. Работает ли вообще? Если работает, то попробуйте завести переменную и добавлять к ней единицу и тоже писать эту переменную в лог. Результаты – в студию!
Здравствуйте! ничего не могу сделать. научите, пожалуйста, как писать в log? всё что мне удалось заметить, что если включить отладку, то файл messages заполняется с невероятной скоростью и найти там что-то полезное не получается. есть какие-то значения связанные с клавиатурой, но ничего поясняющего нет. т.е. например значение 130000.3234452434356. вообщем если можно расскажите пошагово, как писать выводы определённого устройства в log? спасибо!
soundbit, приветствую! В лог писать можно через функцию
log("что-то там");
Читать этот лог можно, нажав на иконку с гаечным ключом внизу справа.
См. рисунок:
Взят скрипт из примера, который в комплекте идет.
Я говорил об отладке в скриптах Wiren Board.
да, действительно, отладка нашлась, но туда ничего не пишется. совсем ничего.
Много времени прошло, можете прислать две вещи:
- Подпишитесь на топик клавиатуры и пришлите все, что туда у вас падает при нажатии на клавиши (можно на support);
- Текст скрипта, который должен писать в лог, но ничего не пишет.
Эх, вот не зря Евгений в самом начале написал, что “Проще всего считать, что нельзя”!
Сергей, все оказалось проще, чем думалось. Не углядели в вашем питоновском скрипте: публикуйте значения, полученные от клавиатуры, не в
/devices/external_keyboard/controls/value
а в
/devices/external_keyboard/controls/value/on
— у нас правила отрабатывают только на изменения значений со /on