0
Answered
Помощь в написании JS
Изучал С++, Delphy еще в школе из-за отсутствия в необходимости так и не развил навыки в программировании. Сейчас в связи с работой приходится работать с вашим продуктом, но изучать javascript нету времени к сожалению. Есть желание разобраться в JS, но мне нужна помощь в этом. Есть вопросы например по модулям, например sonos как реализуется чтение контента с сервера или с любого другого устройства? - это самый для меня главный вопрос т.к. как я его хочу проецировать на другое оборудование. В скрипте так и не понял посылается ли команда на запрос контента или каким-то другим способом этот процесс происходит?
Customer support service by UserEcho
Это можно сделать с помощью скриптов. Вам надо создать слушатель TAG_CHANGE, и все сообщения которые в него приходят складывать в массив, и содержание массива записывать в элемент list
Все верно, элемент типа list, список, для вас будет служить инструментом для отображения сообщений. Количество элементов в списке будет ограничено 5 элементами.
Для работы со списком у нас есть документация LIST API:
http://wiki2.iridiummobile.ru/List_API
Как, сообщил Илья, вам потребуется слушатель на событие EVENT_TAG_CHANGE, что бы в момент получения нового значения для одного из 5 каналов обратной связи можно было создать новый элемент в списке.
http://wiki2.iridiummobile.ru/Drivers_API#EVENT_TAG_CHANGE
Сложность задачи в вашем случае заключается, в сортировке ваших записей. Если заполнять список простым способом, то последняя запись всегда будет последняя.
Как раз для сортировки записей вам потребуется структура - массив.
Устройство - Драйвер.канал 1 - Новое значение - Функция сортировки массива - готовой отсортированный массив из пяти записей, где первая последняя
И уже готовый массив, вы сможете в первую очередь отобразить в списке и записать в переменную проекта, что бы в иметь возможность в оффлайн режиме увидеть сообщения.
Алгоритм сортировки, примерно такой:
1. При получении нового значения (событие EVENT_TAG_CHANGE), берем первые 4-е элемента массива и сдвигаем на одну позицию вниз. 5-ый элемент будет потерян и станет равным 4-ому.
2. В место первого пишем новое значение.
3. Очищаем список, заполняем по новой.
4. Сохраняем массив в переменную проекта.
Как перемещать значения в массиве читайте на javascript.ru
Алгоритм записи и чтения массива в переменную проекта, есть на WIKI:
http://wiki2.iridiummobile.ru/Tokens_API#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B8.D1.82.D1.8C_.D0.B2.D1.80.D0.B5.D0.BC.D1.8F
При старте приложения, необходимо будет выполнить 3-ый пункт заполнения списка, предварительно загрузив значения из переменой проекта.
Как получить дату и время
http://wiki2.iridiummobile.ru/Tokens_API#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B8.D1.82.D1.8C_.D0.B4.D0.B0.D1.82.D1.83
http://wiki2.iridiummobile.ru/Tokens_API#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B8.D1.82.D1.8C_.D0.B2.D1.80.D0.B5.D0.BC.D1.8F
1. Запуск приложения событие IR.EVENT_START
2. Читаю данные из переменной проекта IR.GetVariable
3. Если переменная проекта пустая null, то ни чего не делаю
4. Если в переменной есть массив, загружаю его по известному алгоритму на WIKI
5. Создаю список из массива используя LIST_API
Подписываюсь на событие TAG_Change и ожидаю изменений.
Есть изменение - отправляю новое значение в функцию сортировки массива и так далее.
Проверять имя канала надо в событие TAG_CHANGE, массив же просто контейнер данных.
Разбирайтесь, во время программирования все станет яснее.
>> Как мне в проекте записать массив в переменную проекта?
Алгоритм записи и чтения массива в переменную проекта, есть на WIKI:
http://wiki2.iridiummobile.ru/Tokens_API#.D0.97.D0.B0.D0.BF.D0.B8.D1.81.D1.8C_.D0.BC.D0.B0.D1.81.D1.81.D0.B8.D0.B2.D0.BE.D0.B2_.D0.B2_Projects_Token_.D0.B8_.D0.B8.D1.85_.D0.B8.D0.B7.D0.B2.D0.BB.D
>> Так и не понял как мне из 500 каналов найти 5 каналов по имени и вбить в массив?
Все верно, именно по имени, вы сможете найти каналы.
Событие которое возвращает имя изменившегося канала и новое значение:
http://wiki2.iridiummobile.ru/Drivers_API#EVENT_TAG_CHANGE
>> Еще можно назначить слушатель TAG_Change на определенный канал?
На определенный канал в общем смысле нет, можно назначить слушатель на одно устройство, событие же будет срабатывать при любом измененном канале от устройства. А вот функция которая будет выполняться при активации события в действительности может реагировать именно на конкретный канала.
Проблема при заполнении если порядок нарушается как в скрипте, меняются позиции, как избавиться от этого?
Где i в скобках там квадратные скобки, почему-то квадратные исчезаю при создания поста…
Что бы при публикации сообщения, квадратные скобки не исчезали, ставьте пробелы после и перед скобкой.
В вашем коде замените функцию создания списка, на функцию из примера проекта SortEvents, который я прикрепил. Думаю с примером вы разберетесь. В примере выполняется сортировка списка и его отображение по вашим условиям. Все что осталось сделать прикрепить вызов функции сортировки к событиям получения данных, как вы сделали в своем примере.
В конце апреля будут вебинары по скриптам, рекомендую посетить.
Список вебинаров:
http://www.iridiummobile.ru/academy/#tab1
TEST_LIST.irpz
listarray.irpz
Как написано, так и делается, вы сами сравниваете каждый такт работы приложения все значения, и если значения равны 1, то создаете элементы массива.
Пример:
Допустим все датчике выключены и раны нулю.
Сработал датчик на кухне, проверяю, n12 = 1, да, создаю элемент 1.
Сработал датчик в комнате отдыха, проверяю n12 = 1, да, создаю элемент 2, проверяю n08 = 1, да создаю элемент 3.
и так далее..
Без оборудования с эмулировать работу датчиков можно, но нужно ли.
В случае работы с оборудованием, необходимо использовать событие
http://wiki2.iridiummobile.ru/Drivers_API#EVENT_TAG_CHANGE
и вот так сравнивать не надо будет:
if (n12 == 1)
{
SortEvents("Протечка в кухне!");
}
IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("KNX"), function(name, value) {
var message;
switch(name){
case "Имя_1":
message = "Протечка в кухне!";
case "Имя_2":
message = "Протечка в баре!"
case "Имя_N":
message = "Протечка в N!"
SortEvents(message);
break;
}
});
По старту приложения, что бы воссоздать массив, используйте примеры работы с массивами, см. посты ниже.
Данный скрипт не написать за 10 минут, его надо хорошо продумать.
Постарайтесь, описать вашу идею, то как это должно работать более подробно, разделите процесс достижения цели, на несколько подзадач, это поможет определить то, что надо реализовать и получить скрипт.
Еще раз напоминаю о возможности записаться на вебинары по скриптам:
http://www.iridiummobile.ru/academy/script/
они будут проходить в конце апреля.
По возникшим вопросам, можете обратиться в скайп к тренеру по скриптам:
markov.ilya1
[font=verdana]По вашему дополнению про попапы:[font=verdana]так как каналов для оповещений всего 5, и показываться одновременно может только 5 последний сообщений, в данном случае самое простое решение это создать 25 заранее подготовленных попапов в проекте, по 5 на каждое событие, и менять отображение времени его показа через скрипт.
Ошибки.jpg
Ошибки.jpg_thumb
>> Как показать попалы как на рисунке?
Стандартные эффекты будут препятствовать показу попапов в произвольной позиции.
Поэтому, в редакторе у попапов удаляете все эффекты показа / скрытия, если они есть. Окно Object Properties / General поле Effects.
Через скрипт используете команду показа попапа IR.ShowPopup(ИмяПопапа); Описание функции ищите в вики в разделе GUI API
Сразу же после этой функции пишите команду изменения позиции попапа.
IR.GetItem(ИмяПопапа).X = ЗначениеПозиции;
IR.GetItem(ИмяПопапа).Y = ЗначениеПозиции;
Вычисление позиции со смещением каждого нового линейно вниз по координатам X реализуется на ваш вкус.
Можно как пример хранить число показанных на экране ошибок и умножать шаг смещения на него.
>> И чтобы на каждом было время когда оно появилось
Как работать с датой и временем в JS, первая ссылка в гугле:
http://learn.javascript.ru/datetime
Что бы отобразить дату на попапе, создайте на каждом из них элемент и в свойство Text элемента пишите дату в момент показа попапа. Сразу же после команд изменения позиции попапа:
IR.GetItem(ИмяПопапа).GetItem(ИмяЭлемента).Text = new Date().toString();
Что бы показать нужный попап к нужной ошибке, лучше всего использовать одинаковые префиксы имен попапов, равные именам каналов обратной связи уведомляющей об ошибке с числом равным количеству показанным попапам
ИмяПопапа = ИмяКаналаОбратнойСвязи + СколькоПопаповПоказано;
Например
ПротечкаКухня1
ПротечкаКухня2
.. и т.д
В событии IR.EVENT_TAG_CHANGE по получению нужного значения, получаете имя канала, смотрите на количество уже отображенных попапов, собираете имя попапа и передаете в функцию показа попапа IR.ShowPopup(ИмяКанала + СколькоПопаповПоказано)
Дальше размещаете попап и печатаете дату как описано предыдущем посте.