0
Answered

Помощь в написании JS

KO_Avans 10 years ago in Tips and Tricks updated by Aleksandr Romanov (CTO) 7 years ago 24
Изучал С++, Delphy еще в школе из-за отсутствия в необходимости так и не развил навыки в программировании. Сейчас в связи с работой приходится работать с вашим продуктом, но изучать javascript нету времени к сожалению. Есть желание разобраться в JS, но мне нужна помощь в этом. Есть вопросы например по модулям, например sonos как реализуется чтение контента с сервера или с любого другого устройства? - это самый для меня главный вопрос т.к. как я его хочу проецировать на другое оборудование. В скрипте так и не понял посылается ли команда на запрос контента или каким-то другим способом этот процесс происходит?
Добрый день. Советую вам посетить наши вебинары по скриптам. Там вам помогут быстро разобраться с разработкой скриптов. По всем вопросам(в отношении скриптов) пишите в скайп markov.ilya1
Не могу придумать алгоритм, у меня 5 обратных связей, т.е. для каждой тревоги в доме. При включении тревоги шлется 1 на каждый адрес. При этом нужно вывести эти тревоги и в какое время они произошли. При чем чтобы не загружать клиент выводиться должно максимально последних 5 сообщений. При чем если одна и та же тревога сработала 2 раза должно вывести 2 одинаковых сообщений, но с разным временем. Буду благодарен если выложите пример хотя бы как вывести 2 сообщения с тревогой(я так понимаю с помощью элемента list)?
Добрый день.


Это можно сделать с помощью скриптов. Вам надо создать слушатель TAG_CHANGE, и все сообщения которые в него приходят складывать в массив, и содержание массива записывать в элемент list
Зачем мне выводить весь массив в list? Мне нужно во первых изъять из массива, если идти в этом направлении, те значения которые шлет определенный адрес. Во вторых зафиксировать время и номер порядка этого события, при чем в листе в самом вверху выводится последнее сообщение. В третьих хотелось бы проверить без неативного драйвера, а через переменные проекта. Пока что я не понял смысла массива…
Здравствуйте, KO_Avans!

Все верно, элемент типа 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




Спасибо, это уже что-то. Я думал что в массив будет записываться вся информация, а оказывается можно записать отдельно значения 5 каналов(адресов). Да и еще как я проверю массив в оффлайне если TAG_Change работает столько с устройством, а не с переменными проекта?
Для работы с массивом вам не нужно событие TAG_Change. TAG_Change в этом случае это инициатор, что с массивом надо что-то сделать. Но в случае оффлайн, инициатором будет выступать событие запуска приложения.

1. Запуск приложения событие IR.EVENT_START
2. Читаю данные из переменной проекта IR.GetVariable
3. Если переменная проекта пустая null, то ни чего не делаю
4. Если в переменной есть массив, загружаю его по известному алгоритму на WIKI
5. Создаю список из массива используя LIST_API

Подписываюсь на событие TAG_Change и ожидаю изменений.
Есть изменение - отправляю новое значение в функцию сортировки массива и так далее.
Как мне тогда с массива, проверить имя канала для того чтобы знать какую ошибку мне выдать в list?
Если к каждому из ваших каналов обратной связи существует определенная ошибка, например Канала 1 - это датчик открытия двери, и при полученнии единицы, это означает, что дверь открыта, то в момент создания массива, вместо значения в массив вы пишите, то сообщение об ошибке которое должно быть отображено.

Проверять имя канала надо в событие TAG_CHANGE, массив же просто контейнер данных.

Разбирайтесь, во время программирования все станет яснее.
Я так понимаю массив получается будет состоять из 5 строк и нескольких столбцов. Получается при проверки заполнится лист, дальше при TAG_CHANGE будет меняться сам массив, а алгоритм построения останется тем же что и в начале?
Как мне в проекте записать массив в переменную проекта? Так и не понял как мне из 500 каналов найти 5 каналов по имени и вбить в массив? Еще можно назначить слушатель TAG_Change на определенный канал?
Здравствуйте, KO_Avans!

>> Как мне в проекте записать массив в переменную проекта?

Алгоритм записи и чтения массива в переменную проекта, есть на 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 на определенный канал?

На определенный канал в общем смысле нет, можно назначить слушатель на одно устройство, событие же будет срабатывать при любом измененном канале от устройства. А вот функция которая будет выполняться при активации события в действительности может реагировать именно на конкретный канала.
IR.AddListener(IR.EVENT_START,0,function()

var List = IR.GetItem("Page 1").GetItem("Item 1");
var n12=IR.GetVariable("Global.Kitchen");
var n08=IR.GetVariable("Global.Living room");
var n16=IR.GetVariable("Global.Toilet");
var n02=IR.GetVariable("Global.Bathroom");
var n03=IR.GetVariable("Global.Kabinet");
var m=[0,0,0,0,0];
var i=5;
var x=[];
if (n12 == 1)
    {
    i=i-1;
    x= "Протечка на кухне!";
    m=i;
    List.CreateItem(m
(i),0,{Text: x(i)});
  //  IR.Log(i)
    }
     
if (n08==1)
      { 
      i=i-1;
      m=i;
      x="Протечка в комнате отдыха!";
      List.CreateItem(m
(i),0,{Text: x(i)});
    //  IR.Log(i)
      }     
if (n16==1)
      { 
      i=i-1;
      x="Протечка в гостивом туалете!";
      m=i;
      List.CreateItem(m
(i),0,{Text: x(i)});
    //  IR.Log(i)
      }
if (n02==1)
      { 
      i=i-1;
      m=i;
      x="Протечка в ванной!";
      List.CreateItem(m
(i),0,{Text: x(i)});
    //  IR.Log(i)
      }
if (n03==1)
      { 
      i=i-1;
      m=i;
      x="Протечка в кабинете!";
      List.CreateItem(m(i),0,{Text: x(i)});
    // IR.Log(i)
      }
     
IR.Log(m);
IR.Log(x);


});

Проблема при заполнении если порядок нарушается как в скрипте, меняются позиции, как избавиться от этого?
Где i в скобках там квадратные скобки, почему-то квадратные исчезаю при создания поста…
Здравствуйте, KO_Avans!

Что бы при публикации сообщения, квадратные скобки не исчезали, ставьте пробелы после и перед скобкой.

В вашем коде замените функцию создания списка, на функцию из примера проекта SortEvents, который я прикрепил. Думаю с примером вы разберетесь. В примере выполняется сортировка списка и его отображение по вашим условиям. Все что осталось сделать прикрепить вызов функции сортировки к событиям получения данных, как вы сделали в своем примере.

В конце апреля будут вебинары по скриптам, рекомендую посетить.

Список вебинаров:
http://www.iridiummobile.ru/academy/#tab1






TEST_LIST.irpz
Привязал условия к сортировке, но все равно после 3 позиции порядок нарушается) Пример в приложении.
listarray.irpz
Здравствуйте, KO_Avans!

Как написано, так и делается, вы сами сравниваете каждый такт работы приложения все значения, и если значения равны 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;
}

});

По старту приложения, что бы воссоздать массив, используйте примеры работы с массивами, см. посты ниже.
Так я вам код скидывал для начального заполнения. Тогда я понимаю что и для этой задачи лучше использовать switch case? И еще мне не только нужно сравнить Имя_N, но и значения, не будут же они у меня постоянно заполнять лист каждую секунду…
От листа отказались, теперь надо придумать с попалами, допустим есть 5 попалов они должны возникать как окна в виндовс при ошибке. И опять максимум 5, и возможно 5 одинаковых. Пока я не понял концепцию сортировки т.к. порядок не совпадает при различных условиях….  Я так понимаю придется создавать попалы, т.к. показ одного и тоже попала одновременно не возможно. Но как учитывать их порядок уже другой вопрос, и как привязать команду к элементу еще несозданному попалу тоже вопрос…
Добрый день, KO_Avans!

Данный скрипт не написать за 10 минут, его надо хорошо продумать.

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

Еще раз напоминаю о возможности записаться на вебинары по скриптам:
http://www.iridiummobile.ru/academy/script/

они будут проходить в конце апреля.

По возникшим вопросам, можете обратиться в скайп к тренеру по скриптам:
markov.ilya1



[font=verdana]По вашему дополнению про попапы:[font=verdana]так как каналов для оповещений всего 5, и показываться одновременно может только 5 последний сообщений, в данном случае самое простое решение это создать 25 заранее подготовленных попапов в проекте, по 5 на каждое событие, и менять отображение времени его показа через скрипт.
Как показать попалы как на рисунке? И чтобы на каждом было время когда оно появилось
Ошибки.jpg
Ошибки.jpg_thumb
Добрый день, KO_Avans!

>> Как показать попалы как на рисунке?
Стандартные эффекты будут препятствовать показу попапов в произвольной позиции.
Поэтому, в редакторе у попапов удаляете все эффекты показа / скрытия, если они есть. Окно 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();



Блин я вам про Москву, вы мне про Питер) Как составить порядок появления попалов, аналогично к предыдущей проблеме с листом. Но как вы сказали легче получить результат с 25 попалами для 5 каналов, на 5 попалов для каждого канала. Мне пока не важно как будет попал выскакивать с перемещение или без, и его свойства не интересны, мне интересно как реализовать порядок появление попалов(сортировка).
В случае попапов, сортировка намного проще. При показе попапа, команда IR.ShowPopup, делает последний показанный попап будет выше всех остальных. Сортировка упрощается до минимума - только комбинация функций показать / скрыть нужное число попапов.

Что бы показать нужный попап к нужной ошибке, лучше всего использовать одинаковые префиксы имен попапов, равные именам каналов обратной связи уведомляющей об ошибке с числом равным количеству показанным попапам

ИмяПопапа = ИмяКаналаОбратнойСвязи + СколькоПопаповПоказано;

Например

ПротечкаКухня1
ПротечкаКухня2
.. и т.д


В событии IR.EVENT_TAG_CHANGE по получению нужного значения, получаете имя канала, смотрите на количество уже отображенных попапов, собираете имя попапа и передаете в функцию показа попапа IR.ShowPopup(ИмяКанала  + СколькоПопаповПоказано)

Дальше размещаете попап и печатаете дату как описано предыдущем посте.