<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lite.iridi.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ildar</id>
		<title>Module developer - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://lite.iridi.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ildar"/>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Ildar"/>
		<updated>2026-04-21T21:08:21Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12024</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12024"/>
				<updated>2017-04-17T05:27:32Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Example of processing new module settings»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
When declaring this function, the application will add an edit settings button in the module.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;Done&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&amp;lt;br/&amp;gt;&lt;br /&gt;
Also in this function you need to process the success of changing settings. The flag is responsible for this.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the installation of new parameters was successful, then the value of the flag should be set to &amp;quot;true&amp;quot;, and the opposite case should be &amp;quot;false&amp;quot;. This allows the application to understand that the parameter change failed (if the status of the variable is &amp;quot;false&amp;quot;) and the application will cancel the driver settings change, returning the old settings&amp;lt;br/&amp;gt;&lt;br /&gt;
Example of processing new module settings&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/210/en&amp;diff=12023</id>
		<title>Translations:DevManual/210/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/210/en&amp;diff=12023"/>
				<updated>2017-04-17T05:27:31Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Example of processing new module settings»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example of processing new module settings&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12022</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12022"/>
				<updated>2017-04-17T05:26:21Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «If the installation of new parameters was successful, then the value of the flag should be set to &amp;quot;true&amp;quot;, and the opposite case should be &amp;quot;false&amp;quot;. This allows the…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
When declaring this function, the application will add an edit settings button in the module.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;Done&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&amp;lt;br/&amp;gt;&lt;br /&gt;
Also in this function you need to process the success of changing settings. The flag is responsible for this.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the installation of new parameters was successful, then the value of the flag should be set to &amp;quot;true&amp;quot;, and the opposite case should be &amp;quot;false&amp;quot;. This allows the application to understand that the parameter change failed (if the status of the variable is &amp;quot;false&amp;quot;) and the application will cancel the driver settings change, returning the old settings&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/209/en&amp;diff=12021</id>
		<title>Translations:DevManual/209/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/209/en&amp;diff=12021"/>
				<updated>2017-04-17T05:26:20Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «If the installation of new parameters was successful, then the value of the flag should be set to &amp;quot;true&amp;quot;, and the opposite case should be &amp;quot;false&amp;quot;. This allows the…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If the installation of new parameters was successful, then the value of the flag should be set to &amp;quot;true&amp;quot;, and the opposite case should be &amp;quot;false&amp;quot;. This allows the application to understand that the parameter change failed (if the status of the variable is &amp;quot;false&amp;quot;) and the application will cancel the driver settings change, returning the old settings&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12020</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12020"/>
				<updated>2017-04-17T05:18:56Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
When declaring this function, the application will add an edit settings button in the module.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;Done&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&amp;lt;br/&amp;gt;&lt;br /&gt;
Also in this function you need to process the success of changing settings. The flag is responsible for this.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/207/en&amp;diff=12019</id>
		<title>Translations:DevManual/207/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/207/en&amp;diff=12019"/>
				<updated>2017-04-17T05:18:55Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;Done&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/208/en&amp;diff=12017</id>
		<title>Translations:DevManual/208/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/208/en&amp;diff=12017"/>
				<updated>2017-04-17T05:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Also in this function you need to process the success of changing settings. The flag is responsible for this.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also in this function you need to process the success of changing settings. The flag is responsible for this.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12018</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12018"/>
				<updated>2017-04-17T05:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Also in this function you need to process the success of changing settings. The flag is responsible for this.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
When declaring this function, the application will add an edit settings button in the module.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;ready&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&amp;lt;br/&amp;gt;&lt;br /&gt;
Also in this function you need to process the success of changing settings. The flag is responsible for this.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12016</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12016"/>
				<updated>2017-04-17T05:17:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
When declaring this function, the application will add an edit settings button in the module.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;ready&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/207/en&amp;diff=12015</id>
		<title>Translations:DevManual/207/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/207/en&amp;diff=12015"/>
				<updated>2017-04-17T05:17:24Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When the user clicks on this button, the application opens the Setup window that was used to install the module. In this window, the user enters new settings and presses the &amp;quot;ready&amp;quot; button. After that, the application runs the above function. The driver settings can be changed by the application itself, other module settings developer must change manually. New settings are written to the input parameter in_oSetup as a JSON line.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/206/en&amp;diff=12013</id>
		<title>Translations:DevManual/206/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/206/en&amp;diff=12013"/>
				<updated>2017-04-17T05:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «When declaring this function, the application will add an edit settings button in the module.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When declaring this function, the application will add an edit settings button in the module.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12014</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12014"/>
				<updated>2017-04-17T05:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «When declaring this function, the application will add an edit settings button in the module.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
When declaring this function, the application will add an edit settings button in the module.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12012</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12012"/>
				<updated>2017-04-17T04:58:20Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Processing of new module parameters»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	Processing of new module parameters&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/205/en&amp;diff=12011</id>
		<title>Translations:DevManual/205/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/205/en&amp;diff=12011"/>
				<updated>2017-04-17T04:58:19Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Processing of new module parameters»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Processing of new module parameters&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12010</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12010"/>
				<updated>2017-04-17T04:57:53Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a f…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	обработка новых параметров модуля&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/204/en&amp;diff=12009</id>
		<title>Translations:DevManual/204/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/204/en&amp;diff=12009"/>
				<updated>2017-04-17T04:57:52Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a f…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;While working with the application, there may be a need to change the settings of the module. To provide such an opportunity, the module developer must create a function to change the module settings and assign it to the system method&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12008</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12008"/>
				<updated>2017-04-17T04:55:02Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the sma…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
В ходе работы с приложением, может возникнуть потребность изменить настройки модуля. Для обеспечения такой возможностью, разработчик модуля должен создать функцию изменения настроек модуля и присвоить ее к системному методу&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	обработка новых параметров модуля&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/203/en&amp;diff=12007</id>
		<title>Translations:DevManual/203/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/203/en&amp;diff=12007"/>
				<updated>2017-04-17T04:55:01Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the sma…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example of specifying the adding subdevices window. When developing, you need to create an adding window in the tablet resolution and a separate window in the smartphone resolution&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12006</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12006"/>
				<updated>2017-04-17T04:48:42Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Пример указания окна добавления подустройств. При разработке, надо создавать окно добавления в разрешении планшета и отдельно окно в разрешении смартфона&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
В ходе работы с приложением, может возникнуть потребность изменить настройки модуля. Для обеспечения такой возможностью, разработчик модуля должен создать функцию изменения настроек модуля и присвоить ее к системному методу&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	обработка новых параметров модуля&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/202/en&amp;diff=12005</id>
		<title>Translations:DevManual/202/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/202/en&amp;diff=12005"/>
				<updated>2017-04-17T04:48:41Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If the popup is assigned to the specified system variable, the user will see a &amp;quot;+&amp;quot; button in the module settings section. This button opens the specified popup&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12004</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12004"/>
				<updated>2017-04-17T04:44:57Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&amp;lt;br/&amp;gt;&lt;br /&gt;
Если к указанной системной переменной привязан попап, то в разделе настроек модуля пользователь увидит кнопку &amp;quot;+&amp;quot;, которая открывает указанный попап&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Пример указания окна добавления подустройств. При разработке, надо создавать окно добавления в разрешении планшета и отдельно окно в разрешении смартфона&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
В ходе работы с приложением, может возникнуть потребность изменить настройки модуля. Для обеспечения такой возможностью, разработчик модуля должен создать функцию изменения настроек модуля и присвоить ее к системному методу&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	обработка новых параметров модуля&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/201/en&amp;diff=12003</id>
		<title>Translations:DevManual/201/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/201/en&amp;diff=12003"/>
				<updated>2017-04-17T04:44:56Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You have to assign a window with the results of the scanner operation or a popup in which the user can configure a new subdevice or add this subdevice. This popup should be developed by the developer himself.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12002</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12002"/>
				<updated>2017-04-17T04:39:23Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
К этой системной переменной надо привязать окно, с результатами работы сканера или попап, в котором пользователь может указать настройки нового подустройства и добавить это подустройство. Такой попап разработчик модуля должен разработать самостоятельно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Если к указанной системной переменной привязан попап, то в разделе настроек модуля пользователь увидит кнопку &amp;quot;+&amp;quot;, которая открывает указанный попап&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Пример указания окна добавления подустройств. При разработке, надо создавать окно добавления в разрешении планшета и отдельно окно в разрешении смартфона&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
В ходе работы с приложением, может возникнуть потребность изменить настройки модуля. Для обеспечения такой возможностью, разработчик модуля должен создать функцию изменения настроек модуля и присвоить ее к системному методу&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	обработка новых параметров модуля&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/200/en&amp;diff=12001</id>
		<title>Translations:DevManual/200/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/200/en&amp;diff=12001"/>
				<updated>2017-04-17T04:39:22Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;After adding the subdevices via the scanner or Setup, the user may have a need to add other subdevices. To ensure this, module developer has to assign the system variable&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12000</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=12000"/>
				<updated>2017-04-17T04:38:36Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «After adding the subdevices via the scanner or Setup, the user may have a need to add additional subdevices. To ensure this, module developer has to assign the sy…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Control items are combined and united in a block, blocks are united into a control panel.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Buttons===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется для отправки команды на устройство, вне зависимости от его текущего состояния.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
«On/off» switch. It is used only when the currect device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Multistate button is used only when the current device status is known.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Arrow-button===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Sliders===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Description===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icons===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
All icons are devided by their spheres of use, their main differene is the size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===«Header» widget===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Icon location===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The standard is 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
All buttons have two states - active and inactive&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
When the button in inactive the color is always # 848484 or RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The state of a button is considered active, when the action received feedback and is short or instant (e.g. «Play» in a media player) or an acrion that is active for a long time and demands another activity to switch off the active state (e.g. «Repeat» in a media player).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Basics of working with scripts==&lt;br /&gt;
 &lt;br /&gt;
To design an interface and to add a driver, you are to develop the logics of module work via script. The script part of developing i3 lite modules has a number of special features. Before developing the script part of i3 lite modules, please, read [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] and [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
A module can contain any number of scripts. There are several types of scripts for modules:&lt;br /&gt;
* Driver - script files of this type contain script, responsible for working with a driver&lt;br /&gt;
* GUI - script files of this type contain script, responsible for working with graphics&lt;br /&gt;
* Common - script files of this type must contain general scripts, such as a set of additional functions or a description of classes of secondary importance&lt;br /&gt;
* Setup - a special script file that contains information about module setting, a list of fields that are obligatory to fill in, types of these fields and functions that check the correctness of entered data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Devision into types is necessary for the module correct work on the server. Only logics and the driver part work on the server, but the server knows nothing about the graphic part. That's why a module developer has to devide scripts into types. The server does not notice files for working with the graphic part. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When modules are developed module names have to be used instead of IR. Thus, a listener looks this way module.AddListener… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - first js file&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Pointer to a text variable&lt;br /&gt;
//Name_2.js - second js file&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Importing an object with a pointer to a text variable from the first js file&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //log the text variable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Creating a subdevice==&lt;br /&gt;
The basis of every module is subdevices. The task of every module developer is to define how many subdevices a module has and to develop the logics of subdevice work. Each subdevice may contain a widget, a remote control, a set of actions, events and states. All contents of a subdevice have to be indicated when a subdevice is created. Subdevice contents can't be changed during module work. The following command is used  to create a subdevice:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - subdevice system name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - a driver to which a subdevice will be assigned&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - old parameter, &amp;quot;false&amp;quot; is to be used&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - type of smart device. Parameter is under development&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Array of virtual tag objects&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - subdevice name that is displayed to the user&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - a function that is on till the IR.EVENT_ADD_SUBDEVICE event happens.&amp;lt;br/&amp;gt;&lt;br /&gt;
As a reply the function returns a link to a subdevice, that can be used to address it.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of creating subdevices for HDL Relay devices. The script checks th number of devices in the bus and creates subdevices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Creating a subdevice&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Creating StatusOnStart command&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Adding channels&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Add a virtual tag&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Everything that is required can be added to a subdevice this way. An event is activated when a subdevice is created.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
A link to a subdevice that was created is sent to a function. Different components can be added to subdevice in this event, such as, actions, events, states, widgets, chanels, tags. For example,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Creating actions&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Creating events&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Creating states&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Thus, a developer can create the required number of subdevices when a module is installed or when new subdevices are added manually.&lt;br /&gt;
==Adding a widget to a subdevice==&lt;br /&gt;
 &lt;br /&gt;
After an interface is created in the studio and a function to add subdevices is added, create a copy of a widget for each subdevice and assign it to the subdevice. To assign a widget to a subdevice the following method is used.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--176--&amp;gt;&lt;br /&gt;
The input parameter of the method is '''in_Widget''' - an object, a widget, created in the studio beforehand.&amp;lt;br /&amp;gt;&lt;br /&gt;
The output parameter of the method is '''True''' or '''False''' (successful or not).&amp;lt;br /&amp;gt;&lt;br /&gt;
For example, we have 3 lamps. Not to create a separate wiget for each lamp, use a ready template and clone it.  Here is an example of creating widgets with the help of a code using the existing template .&amp;lt;br /&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Clone method allows to clone an existing popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Calling a widget that we want to clone&lt;br /&gt;
 // Creating a widget using cloning method&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Names of new widgets must not be repeated &lt;br /&gt;
----&lt;br /&gt;
When a complete remote control is opened it is necessary to remmeber that a user will use the module both on a tablet and on a smart phone. The difference betwen the screen sizes makes a developer design 2 types of windows: a version for smart phones and a version for tablets. In addition a method must be added to the script that asks the system about the type of device where a module is launched and open the required window.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //If a module is opened on a smart phone&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //show a popup created for a smart phone&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//If a module is opened on a tablet, show a popup for a tablet&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Work with channels and tags==&lt;br /&gt;
After creating a subdevice and adding a widget you must add to the subevice channels and tags required for its work.  Like in i3 pro version, a driver can be added in the studio or via script. Each subdevice requires a personal set of channels and tags for the selected driver. You may work with the following three components:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Channel. The following method is used to create a channel&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - channel name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array (specific for every driver)&amp;lt;br/&amp;gt;&lt;br /&gt;
*Tag The following method is used to create a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - tag name&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - data array, specific for every driver&amp;lt;br/&amp;gt;&lt;br /&gt;
*Virtual tag. The following method if used to create a virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;where&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- name of a subdevice virtual tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Tag value&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Permission to edit a tag&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Parameter is under development! Set &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Feature of a hidden tag&amp;lt;br/&amp;gt;&lt;br /&gt;
===An example of creating channels and tags when creating a subdevice===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Setting a module in the app==&lt;br /&gt;
Modules are stored in iRidium store and can be installed in the app using one of the following ways:&amp;lt;br/&amp;gt;&lt;br /&gt;
*With the help of a scanner&amp;lt;br/&amp;gt;&lt;br /&gt;
*Manually&amp;lt;br/&amp;gt;&lt;br /&gt;
===Developing the Setup file===&lt;br /&gt;
The Setup file must be developed for each variant. It's a special script file with fields that are required for module work. These fields can be device IP address, port, city name, etc.  To develop a Setup file, create a new script file and select its type - &amp;quot;Setup&amp;quot;. Eacn field is a tag and can be accessed from the script, and the input value can be received.&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
The Setup file consists of 2 parts. Part 1 is the driver settings. The settings must require IP addresses, ports and logins to connect the driver to a device. Part 2 is the module general settings, such as number of outputs, access keys. &lt;br /&gt;
To set fields in the Setip file set the following fields in the script:&lt;br /&gt;
* Field type - indicate what field must be shown to a user (text field, data array, etc. Detailed description is given in API)&lt;br /&gt;
* Field name - name of field that a user sees when setting a module &lt;br /&gt;
* Default value - what value must be put by default&lt;br /&gt;
* Check function - a function to validate value in the field. A function must be written that checks the correctness of the entered data.&lt;br /&gt;
For example,&amp;quot;Setup&amp;quot; script for HDL module looks this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To get data from Setup fields use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Field name&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Besides standard parameters, any parameters required for module inizialization can be asked. Driver parameters are set in the driver automatically. The other parameters are to be asked and used manually.&amp;lt;br /&amp;gt;&lt;br /&gt;
An example of work with Setup parameters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Installing a module manually===&lt;br /&gt;
To install a module manually no additional script development is required. A user must go to iRidium store from the app, find a module, download it and enter date in the fields indicated in the Setup file. After it the app installs the module in the system with parameters entered by a user.&lt;br /&gt;
===Installing a module with the help of a scanner===&lt;br /&gt;
'''Scanner (сканер)''' - это модуль, который анализирует какую-либо шину на подключённые устройства либо ищет устройства в локальной сети. Найденные устройства формируются в список, для выбранного устройства качается модуль и становится доступен в i3 lite. &amp;lt;br/&amp;gt;&lt;br /&gt;
Схема работы сканера:&lt;br /&gt;
# Сканер загружается из магазина;&lt;br /&gt;
# Пользователь вводит параметры сканера (IP, Port и т.д) и эти параметры передаются в скрипт сканера;&lt;br /&gt;
# Сканер, обработав введенные параметры, опрашивает шину на устройства или ищет устройства в локальной сети;&lt;br /&gt;
# Из полученных устройств формируется список;&lt;br /&gt;
# При выборе определенного устройства в списке, сканер передаёт параметры выбранного устройства в модуль.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
При разработке сканера нужно учесть:&lt;br /&gt;
* Параметры сканера, при добавлении из магазина;&lt;br /&gt;
* Логику сканера;&lt;br /&gt;
* Передачу параметров выбранного устройства в модуль;&lt;br /&gt;
* Логику модуля, с учётом переданных от сканера параметров.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Процесс разработки сканера ничем не отличается от разработки модуля. Точно также сканеру необходимо нарисовать визуальную часть, создать драйвер и написать скрипт с логикой. Основным отличием является то, что сканер может работать только на панели управления и сканер никогда не будет запущен на сервере, поэтому, при разработке скриптов, нет необходимости разделять скрипты на драйверные и интерфейсные.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Также при разработке сканера появляется новая логика работы. Первым делом необходимо сделать модуль для управления устройством, далее надо загрузить модуль в магазин модулей. При загрузке модуля, вы увидите уникальный идентификатор вашего модуля. Когда вы будете разрабатывать сканер, вам необходимо написать скрипт со следующей логикой:&lt;br /&gt;
# Создание драйвера&lt;br /&gt;
# Поиск оборудования&lt;br /&gt;
# Если оборудование найдено, надо определить что это за оборудование&lt;br /&gt;
# При помощи команды ModuleSetupFinish (ID модуля, js объект с настройками setup данного модуля)&lt;br /&gt;
После этого приложение скачет модуль из магазина модулей и установит его.&amp;lt;br/&amp;gt;&lt;br /&gt;
The distinctive feature of developing a scanner is the event that lauches the driver work. When developing a scanner use the following event&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_OPEN_SCANNER, 0, function (){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A scanner must be developed after modules are developed. The developed modules are registered in the store of modules and are given a unique ID. After a scanner finds devices in the local net, the script must download a module for the found equipment by the indicated ID. To download a module use the following function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
IR.ModuleSetupFinish(StoreID, ModuleData, [Callback])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &lt;br /&gt;
* StoreID - module ID in the store of modules&lt;br /&gt;
* ModuleData - data required for installing a module (fields in Setup)&lt;br /&gt;
* Callback -  a function to process errors that happened in the installation process (optional)&lt;br /&gt;
An example of a developed scanner for HDL modules. To install any module the following parameters are required: Type,SubNet id, Device id, module name, bus IP address, port. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Example of installing HDL Dimmer with a scanner&lt;br /&gt;
var l_nStoreID = 82;&lt;br /&gt;
var l_oModuleData = {&lt;br /&gt;
	Module: {&lt;br /&gt;
		//Data required for module work&lt;br /&gt;
		Type: &amp;quot;Dimmer&amp;quot;, &lt;br /&gt;
		SubnetID: 3,&lt;br /&gt;
		DeviceID: 6 &lt;br /&gt;
		Name: &amp;quot;HDL Dimmer&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	Drivers: {&lt;br /&gt;
		//Data for the driver&lt;br /&gt;
		&amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;: {&lt;br /&gt;
		   Host: &amp;quot;255.255.255.255&amp;quot;, //installing a host for the driver&lt;br /&gt;
		   Port: &amp;quot;6000&amp;quot; //installing a port for the driver&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
IR.ModuleSetupFinish(l_nStoreID, l_oModuleData, function(in_error){&lt;br /&gt;
	if (!in_error){&lt;br /&gt;
		...&lt;br /&gt;
	} else {&lt;br /&gt;
		...&lt;br /&gt;
	}	&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Adding subdevices manually===&lt;br /&gt;
After adding the subdevices via the scanner or Setup, the user may have a need to add additional subdevices. To ensure this, module developer has to assign the system variable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SettingsPopupName = module.GetPopup('AddSubDevicePopup');&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
К этой системной переменной надо привязать окно, с результатами работы сканера или попап, в котором пользователь может указать настройки нового подустройства и добавить это подустройство. Такой попап разработчик модуля должен разработать самостоятельно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Если к указанной системной переменной привязан попап, то в разделе настроек модуля пользователь увидит кнопку &amp;quot;+&amp;quot;, которая открывает указанный попап&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Пример указания окна добавления подустройств. При разработке, надо создавать окно добавления в разрешении планшета и отдельно окно в разрешении смартфона&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   module.SettingsPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:NoAuthorize&amp;quot;).Name: module.GetPopup(&amp;quot;NoAuthorize&amp;quot;).Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AddSubdeviceWindow.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Authorization===&lt;br /&gt;
To work with certain devices a user's authorization in a third-party system is required. i 3lite app has a special authorization mechanism for this purpose.&amp;lt;br/&amp;gt;&lt;br /&gt;
To authorize a user has to enter his access data in a special window. This window is unique for every device and a module developer must create it. A window to enter data is a popup with fields to enter data. The popup is created with the help of standard means of the studio and it may be unassigned to any subdevices.  When access data are entered, the script must authorize in a third-party system and close the authorization window. After creating an authorization popup, a developer must call the authorization system variable in the script and assign the created popup in the variable.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationPopupName = module.GetPopup(&amp;quot;AutorisationPopup&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
After an authorization popup is assigned to a variable, &amp;quot;Authorize&amp;quot; button appears in the module settings.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:NeedAuthorization1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
When this button is pressed, the app opens the authorization popup, assigned in the script.  The next task for a module developer is to display a user's status (Authorized or not). There is a system variable to solve this task.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
AuthorizationStatus = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
If a user is authorized in the system, true value is assigned to the variable and the app changes the status of the authorization button into:&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Logout1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
A module devloper must also think about the mechanism of deauthorization. It is done on the authorization popup.&amp;lt;br/&amp;gt;&lt;br /&gt;
An example of the authorization script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (module.AuthorizationStatus  == false) { //If a user is not authorized&lt;br /&gt;
  module.AuthorizationPopupName = WindowSettings.Window.Name;//Assigning the authorization popup created earlier  &lt;br /&gt;
} else if (module.AuthorizationStatus) //If a user is authorized&lt;br /&gt;
  {&lt;br /&gt;
	 module.AuthorizationPopupName = IR.DisplayType != IR.DISPLAY_TYPE_TABLET? module.GetPopup(&amp;quot;phone:deAuth&amp;quot;).Name: module.GetPopup(&amp;quot;deAuth&amp;quot;).Name;//Showing the deauthorization popup&lt;br /&gt;
  }   &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Note. Remember to create a separate authorization/deauthorization popup for a smart phone and for a tablet.&lt;br /&gt;
===Changing settigns===&lt;br /&gt;
В ходе работы с приложением, может возникнуть потребность изменить настройки модуля. Для обеспечения такой возможностью, разработчик модуля должен создать функцию изменения настроек модуля и присвоить ее к системному методу&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.ChangeProperties = function (in_oSetup)&lt;br /&gt;
{&lt;br /&gt;
	обработка новых параметров модуля&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
При объявлении такой функции, приложение добавит в модуль кнопку редактирования настроек модуля.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ChangeBtn.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Когда пользователь нажмет на данную кнопку, приложение откроет окно Setup, которое использовалось при установке модуля. В этом окне пользователь введет новые настройки и нажмет кнопку &amp;quot;готово&amp;quot;. После этого приложение запустить указанную выше функцию. Настройки драйвера приложение сможет изменить самостоятельно, остальные же настройки разработчик модуля дулжен изменить вручную. Новые настройки записываются во входной параметр in_oSetup в виде JSON строки.&amp;lt;br/&amp;gt;&lt;br /&gt;
Также в данной функции необходимо обработать успешность изменения настроек. За это отвечает флаг&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  module.FinishUpdateSettings = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Если установка новых параметров прошла успешно, то надо выставить значение флага true, а обратном случае флаг должен принять значение false. Это позволяет приложению понять что смена параметров не удалась(если статус переменной будет false) и приложение отменит изменение настроек драйвера, вернув старые настройки&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример обработки новых настроек модуля&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){&lt;br /&gt;
   module.ChangeProperties = function (in_oSetup, in_oModule) {&lt;br /&gt;
      if (typeof (in_oSetup) == &amp;quot;string&amp;quot;)&lt;br /&gt;
         in_oSetup = JSON.Parse(in_oSetup);&lt;br /&gt;
            var l_nChannel = in_oSetup.Module[&amp;quot;Channel count&amp;quot;];  &lt;br /&gt;
      if (l_nChannel &amp;gt;= COUNT_CHANNEL) {&lt;br /&gt;
         module.FinishUpdateSettings = true;&lt;br /&gt;
         // Recreating element on cycle&lt;br /&gt;
         for (var count = 1; count &amp;lt;= in_nChannel; count++) {&lt;br /&gt;
            &lt;br /&gt;
            // Creating subDevice&lt;br /&gt;
            l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);&lt;br /&gt;
            &lt;br /&gt;
            // Create revers&lt;br /&gt;
            if (!l_oSubDevice.GetProperty(&amp;quot;Reverse&amp;quot;))&lt;br /&gt;
               l_oSubDevice.SetProperty(&amp;quot;Reverse&amp;quot;, 0);     &lt;br /&gt;
            &lt;br /&gt;
            // Assigned to the variable name of the channel               &lt;br /&gt;
            var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count; &lt;br /&gt;
            &lt;br /&gt;
            // Adding channels&lt;br /&gt;
            l_oSubDevice.AddChannel(l_sChannelName, Data);&lt;br /&gt;
            l_oSubDevice.AddTag(l_sChannelName, Data);&lt;br /&gt;
            &lt;br /&gt;
            // Adding smart virtual tag&lt;br /&gt;
            l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
         }; &lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) &lt;br /&gt;
            if (l_nChannel &amp;lt; count) {&lt;br /&gt;
               var l_oDeleteSubDevice = module.GetSubDevice(&amp;quot;Relay &amp;quot; + count);&lt;br /&gt;
               module.DeleteSubDevice (l_oDeleteSubDevice.ID);&lt;br /&gt;
            };&lt;br /&gt;
      };&lt;br /&gt;
   };    &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/200/en&amp;diff=11999</id>
		<title>Translations:DevManual/200/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/200/en&amp;diff=11999"/>
				<updated>2017-04-17T04:38:35Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «After adding the subdevices via the scanner or Setup, the user may have a need to add additional subdevices. To ensure this, module developer has to assign the sy…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;After adding the subdevices via the scanner or Setup, the user may have a need to add additional subdevices. To ensure this, module developer has to assign the system variable&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/Page_display_title/en&amp;diff=11894</id>
		<title>Translations:DevManual/Page display title/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/Page_display_title/en&amp;diff=11894"/>
				<updated>2017-04-11T07:28:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DevManual&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/Page_display_title/en&amp;diff=11893</id>
		<title>Translations:DevManual/Page display title/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/Page_display_title/en&amp;diff=11893"/>
				<updated>2017-04-11T07:01:50Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Инструкция для разработчиков»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Инструкция для разработчиков&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11644</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11644"/>
				<updated>2017-04-03T10:56:35Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «The principle of constructing a widget block is a constructor from Controls (buttons, switches, labels) from smaller to larger.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/78/en&amp;diff=11643</id>
		<title>Translations:DevManual/78/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/78/en&amp;diff=11643"/>
				<updated>2017-04-03T10:56:34Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «The principle of constructing a widget block is a constructor from Controls (buttons, switches, labels) from smaller to larger.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The principle of constructing a widget block is a constructor from&lt;br /&gt;
Controls (buttons, switches, labels) from smaller to larger.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11642</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11642"/>
				<updated>2017-04-03T10:50:30Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Module grid widget is a block 640 pt wide And 120 pt in height. Each block has a grid of 8x8 pt. The rounding of the corners is 12.5 ut. (Circle 25)»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/77/en&amp;diff=11641</id>
		<title>Translations:DevManual/77/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/77/en&amp;diff=11641"/>
				<updated>2017-04-03T10:50:29Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Module grid widget is a block 640 pt wide And 120 pt in height. Each block has a grid of 8x8 pt. The rounding of the corners is 12.5 ut. (Circle 25)»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Module grid widget is a block 640 pt wide&lt;br /&gt;
And 120 pt in height. Each block has a grid of 8x8 pt.&lt;br /&gt;
The rounding of the corners is 12.5 ut. (Circle 25)&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11640</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11640"/>
				<updated>2017-04-03T10:47:40Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Module grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/76/en&amp;diff=11639</id>
		<title>Translations:DevManual/76/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/76/en&amp;diff=11639"/>
				<updated>2017-04-03T10:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Module grid and blocks&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11638</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11638"/>
				<updated>2017-04-03T10:43:34Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Modular grid and blocks»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Modular grid and blocks===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/76/en&amp;diff=11637</id>
		<title>Translations:DevManual/76/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/76/en&amp;diff=11637"/>
				<updated>2017-04-03T10:43:33Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Modular grid and blocks»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modular grid and blocks&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/75/en&amp;diff=11636</id>
		<title>Translations:DevManual/75/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/75/en&amp;diff=11636"/>
				<updated>2017-04-03T10:42:42Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «The widget consists of the &amp;quot;Header&amp;quot; and additional modules of the main functional. &amp;lt;br/&amp;gt; &amp;quot;Header&amp;quot; - the top module of the widget.&amp;lt;br/&amp;gt; &amp;quot;Header&amp;quot; contains:&amp;lt;br/&amp;gt; - t…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The widget consists of the &amp;quot;Header&amp;quot; and additional modules of the main functional. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;quot;Header&amp;quot; - the top module of the widget.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;quot;Header&amp;quot; contains:&amp;lt;br/&amp;gt;&lt;br /&gt;
- the name of the widget;&lt;br /&gt;
- the name of the device, that&amp;lt;br/&amp;gt;is controlled by the widget;&amp;lt;br/&amp;gt;&lt;br /&gt;
-device category icon.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The additional modules contain the device controls.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/74/en&amp;diff=11634</id>
		<title>Translations:DevManual/74/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/74/en&amp;diff=11634"/>
				<updated>2017-04-03T10:33:51Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Basic principles»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic principles&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11635</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11635"/>
				<updated>2017-04-03T10:33:51Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Basic principles»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Basic principles===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11633</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11633"/>
				<updated>2017-04-03T10:33:41Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different deve…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;br /&gt;
===Основные принципы===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/73/en&amp;diff=11632</id>
		<title>Translations:DevManual/73/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/73/en&amp;diff=11632"/>
				<updated>2017-04-03T10:33:40Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different deve…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the convenience of interface design, a standard was developed in which graphic windows should be developed in the module so that the modules of different developers looked uniformly within the framework of one project.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/72/en&amp;diff=11630</id>
		<title>Translations:DevManual/72/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/72/en&amp;diff=11630"/>
				<updated>2017-04-03T10:26:38Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Interface design standard»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Interface design standard&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11631</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11631"/>
				<updated>2017-04-03T10:26:38Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Interface design standard»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Interface design standard==&lt;br /&gt;
Для удобства проектирования интерфейса был разработан стандарт, в котором следует разрабатывать графические окна в модуле, чтобы модули разных разработчиков выглядели единообразно в рамках одного проекта.&lt;br /&gt;
===Основные принципы===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11629</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11629"/>
				<updated>2017-04-03T10:25:12Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property. &lt;br /&gt;
==Стандарт проектирования интерфейса==&lt;br /&gt;
Для удобства проектирования интерфейса был разработан стандарт, в котором следует разрабатывать графические окна в модуле, чтобы модули разных разработчиков выглядели единообразно в рамках одного проекта.&lt;br /&gt;
===Основные принципы===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/71/en&amp;diff=11628</id>
		<title>Translations:DevManual/71/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/71/en&amp;diff=11628"/>
				<updated>2017-04-03T10:25:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Remote is created like a Widget. The only difference is to select &amp;quot;Remote&amp;quot; when you click &amp;quot;Add Popup Page&amp;quot; in the &amp;quot;Device Type&amp;quot; property.&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/70/en&amp;diff=11626</id>
		<title>Translations:DevManual/70/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/70/en&amp;diff=11626"/>
				<updated>2017-04-03T10:15:42Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is dis…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11627</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11627"/>
				<updated>2017-04-03T10:15:42Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is dis…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (a remote control) is a graphical area to control SubDevices. Unlike wigets, it can have free size and position. And it is displayed on call. Remote is displayed when a button to go to the remote control is pressed on a widget. &lt;br /&gt;
Items to control equipment are placed on Remote (buttons, lists, switches, levels). There can be from 0 to several remote controls. Example of Remote:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Окно создаётся аналогично виджету, с одним лишь отличием, что при нажатии &amp;quot;Add Popup Page&amp;quot; в параметре &amp;quot;Device Type&amp;quot; надо выбрать &amp;quot;Remote&amp;quot;. &lt;br /&gt;
==Стандарт проектирования интерфейса==&lt;br /&gt;
Для удобства проектирования интерфейса был разработан стандарт, в котором следует разрабатывать графические окна в модуле, чтобы модули разных разработчиков выглядели единообразно в рамках одного проекта.&lt;br /&gt;
===Основные принципы===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11625</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11625"/>
				<updated>2017-04-03T10:09:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Remote and other graphic windows»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote and other graphic windows====&lt;br /&gt;
 &lt;br /&gt;
Remote (пульт управления) и прочие окна - это графическое пространство для управления SubDevice, в отличии от виджета они могут иметь произвольные размеры, позицию и отображается по вызову. Пульт отображается в момент, когда на виджете была нажата кнопка перехода к пульту.&lt;br /&gt;
На пульте управления размещаются элементы управления оборудованием (кнопки, списки, переключатели, уровни). Пультов управления может быть от 0 до нескольких. Пример пульта:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Окно создаётся аналогично виджету, с одним лишь отличием, что при нажатии &amp;quot;Add Popup Page&amp;quot; в параметре &amp;quot;Device Type&amp;quot; надо выбрать &amp;quot;Remote&amp;quot;. &lt;br /&gt;
==Стандарт проектирования интерфейса==&lt;br /&gt;
Для удобства проектирования интерфейса был разработан стандарт, в котором следует разрабатывать графические окна в модуле, чтобы модули разных разработчиков выглядели единообразно в рамках одного проекта.&lt;br /&gt;
===Основные принципы===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=Translations:DevManual/69/en&amp;diff=11624</id>
		<title>Translations:DevManual/69/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=Translations:DevManual/69/en&amp;diff=11624"/>
				<updated>2017-04-03T10:09:38Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «Remote and other graphic windows»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Remote and other graphic windows&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	<entry>
		<id>https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11623</id>
		<title>DevManual/en</title>
		<link rel="alternate" type="text/html" href="https://lite.iridi.com/index.php?title=DevManual/en&amp;diff=11623"/>
				<updated>2017-04-03T10:08:39Z</updated>
		
		<summary type="html">&lt;p&gt;Ildar: Новая страница: «In the module settings when it is added to the project:»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
=Module development guide=&lt;br /&gt;
==Definitions==&lt;br /&gt;
&lt;br /&gt;
'''Module''' -  is a component that allows you to control one type of equipment by its unique ID. The module is located in the store of modules.&lt;br /&gt;
&lt;br /&gt;
'''Control panel (mobile device)''' - is a device from which the project i3 lite is launched (tablet, smartphone).&lt;br /&gt;
&lt;br /&gt;
'''Store of modules''' - is a cloud server for uploading ready-made modules. The module store is available from the i3 lite application or on our[http://www.iridiummobile.ru/store/  site]&lt;br /&gt;
&lt;br /&gt;
'''iRidium Studio''' - is a editor that allows to create the module to control device for i3 lite application. You need to use a special editor build for [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE module developers] to develop the module&lt;br /&gt;
&lt;br /&gt;
'''i3 lite''' - is an application to create, set and use i3 lite projects.&lt;br /&gt;
&lt;br /&gt;
'''i3 lite project''' – is an automation project made up of ready equipment control modules.  i3 lite projects differ from i2 Control projects: i3 lite projects can be edited dynamically without prior editing in iRidium Studio. i3 lite project consists of several small parts that can be put together into a single whole in i3 lite app with the help of the built-in constructor. It can also be easily edited in the app. As a result, a big number of intermediate processes are no longer necessary, such as installing software on PC, uploading projects on contol panels. All is done in one place - a control panel.&lt;br /&gt;
&lt;br /&gt;
'''SubDevice''' - This is a virtual representation of the working area of the physical device. If we take as an example a 6-channel dimmer it has 6 sub-devices, because each independent device requires a separate control interface and connects to one channel.&lt;br /&gt;
&lt;br /&gt;
'''Room (in i3 lite)''' - The visual part of i3 lite containing hardware management widgets. The project in i3 lite consists of rooms located on the floors&lt;br /&gt;
&lt;br /&gt;
'''Widget''' - is a visual module component located in the room. It has limitations in size and fixed position in the room interface. It contains the main module functionality. For additional functions Remote is used.&lt;br /&gt;
&lt;br /&gt;
'''Remote''' - is a visual module component which is hidden by default. It opens only when clicking on the corresponding item of the widget. It does not have size limitations (not more than the panel display size) and can be located in any part of the room interface (it is usually located in the middle of the panel display). It contains additional  functionality of the module. &lt;br /&gt;
&lt;br /&gt;
'''Macros''' - is a sequence of commands of various modules, which is activated by pressing. Contains &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, the macros &amp;quot;turn off all the lights in the house&amp;quot; will send the shutdown command to all devices responsible for lighting.&lt;br /&gt;
&lt;br /&gt;
'''Routine''' - is a sequence of commands of various modules, which is activated automatically when a certain event occurs. Contains &amp;quot;Event&amp;quot;, &amp;quot;Action&amp;quot; and &amp;quot;Condition&amp;quot;. For example, &amp;quot;turn on the light if the motion sensor is triggered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Event''' - is a routine component that describes the control command and the value range. If the value is sent in the indicated range, the routine is executed. For example, the event &amp;quot;Motion appeared&amp;quot; is activated if the motion sensor is triggered.&lt;br /&gt;
&lt;br /&gt;
'''Action''' - is a component of macros and routines. It describes the control command and value that must be sent to the command. For example, &amp;quot;turn on the light&amp;quot;. There are 2 types of Action: Simple Action and Advanced Action.&lt;br /&gt;
&lt;br /&gt;
'''Simple Action''' - Simple Action is used when the command and Action value are known in advance.&lt;br /&gt;
&lt;br /&gt;
'''Advanced Action''' - Advanced Action is used when the command is known but the value is unknown. The value is set dynamically when Action is used in i3 lite (but not when creating in iRidium studio).&lt;br /&gt;
&lt;br /&gt;
'''Condition''' - is a component of macros and scenes. It describes the control command and value range. When a value from the value range is sent Action is executed.&lt;br /&gt;
&lt;br /&gt;
'''Scanner''' - is a software part, that analyzes any bus looking for connected devices. Found connected devices are displayed in a list. Modules for the found devices are downloaded from iRidium store and the devices become available to control in i3 lite.&lt;br /&gt;
==Module concept==&lt;br /&gt;
The module is an independent subroutine of the i3 lite application which is built in the project and has an independent interface, driver and logic. Modules are developed in the [http://www.iridiummobile.net/redirects/?go=iRidium_SETUP_LITE iRidium Studio] editor and located in the module store [http://www.iridiummobile.ru/store/ iRidium Store]. Integrator downloads the module from the module store for each individual project.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleInScheme.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of modules:&lt;br /&gt;
*Control module - module for hardware control&lt;br /&gt;
*Scanner - module for searching hardware in the local network and loading modules for found devices&lt;br /&gt;
== How to start developing the module  ==&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{i}} Before starting your work, it is recommended to read [http://dev.iridiummobile.net/How_to_begin  iRidium documentation]. It describes the basics of working with iRidium. The i3 lite documentation describes how to develop modules for the i3 lite platform for users, who already know iRidium. If you want  to write script use [[Special:MyLanguage/Developers_API | i3 lite API]].&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
The module life cycle consists of:&lt;br /&gt;
* Developing the graphic part in iRidium studio  &lt;br /&gt;
* Developing the driver part (scripts, devices)&lt;br /&gt;
* Testing&lt;br /&gt;
* Publishing in iRidium store&lt;br /&gt;
* Using (module download via the i3 lite application from the cloud and adding to automation projects) &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
==Module structure ==&lt;br /&gt;
Each module must consist of subdevices. The subdevice is a virtual representation of the working area of ​​a physical device. Many devices support multiple workgroups with the same functionality. Each workgroup may be in a separate zone. To fully control the zone, you need to create a subdevice for each workgroup of the device. For example, a 6-channel HDL dimmer contains 6 dimmable channels, through which 6 working groups can be controlled. Therefore, it is advisable to select in the module 6 subdevices for the possibility of creating actions, events and conditions for each workgroup separately. The presence of subdevice in the i3 lite module is obligatory. The number of sub-devices can be from one to many. Usually the number of subdevice is equal to the number of channels of the controller, the number of its work areas or logical devices. &lt;br /&gt;
&lt;br /&gt;
Subdevice consists of:&lt;br /&gt;
* Conditions&lt;br /&gt;
* Actions&lt;br /&gt;
* Events&lt;br /&gt;
* Widgets&lt;br /&gt;
&lt;br /&gt;
Conditions, actions and events are logical elements of the subdevice, on their basis macros and routines are created. Widget is a graphical element, through which the user will control subdevice. Usually one subdevice contains one widget, but the number of conditions, actions and events varies (from zero to many). The number of subdevices in the module can be either fixed or not. For example, you can develop a module only for a 6-channel dimmer, and you can make a module that will request the hardware for the number of subdevices  and create the required number of subdevices.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ModuleStruct.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Creating the module interface ==&lt;br /&gt;
The interface part of the midule consists of: &lt;br /&gt;
* widgets - interface part of the subdevice, which is located in the rooms and has basic control functions&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Remote - interface part of the module, which has a set of device functions and opens to the full screen, when you click on the widget button&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:RemoteExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Authorization window - Authorization is required to work with some devices. To do this, the developer can create a special authorization window that is available in the module settings&lt;br /&gt;
картинка кнопки авторизации и окна авторизации&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:AutorisationExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* The module settings window is a window where you need to enter the parameters for the module operation&lt;br /&gt;
картинка окна настроек модуля и кнопки открытия&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:SettingsExample.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The whole graphic part is drawn in the graphical interface of the iRidium studio editor. In contradistinction to i3 pro, the module's interface should be made up of ready-made graphic components located in the gallery. &lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ItemGallery.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Widget ====&lt;br /&gt;
 &lt;br /&gt;
Widget is a visual component of the module, a kind of Popup that will be displayed in the room. The main task of the widget is to display the basic controls of the subdevice and to provide a module transition to the Remote control of the subdevice. For example, to control a media player, you can place a volume slider or Mute button for quick access to adjusting the volume. The weather widget can display the current weather, and the control panel will contain the weather forecast for all 5 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
The module does not make sense without widget, because it will not have a graphical representation in the i3 lite project.&lt;br /&gt;
 &lt;br /&gt;
Widget has a limited size&lt;br /&gt;
# Width '''640'''&lt;br /&gt;
# Height can not exceed '''1200'''&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Пример виджета.png|center|thumb|Рис. Widget example]] &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
To create a widget, click the Add pop-up button in the Project overview panel and in the appeared menu select popup type: &amp;quot;Widget&amp;quot;, set the name and properties: &lt;br /&gt;
[[Файл:ПанельПопап.png|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Properties of a created widget can be changed with the help of '''Object Properties'''.&amp;lt;br /&amp;gt;&lt;br /&gt;
Graphic items are assigned to channels like in popups: &lt;br /&gt;
[[Файл:Связывание_канала_команды_и_графического_элемента.png|center|thumb|Рис. Связывание канала команды и графического элемента]]&lt;br /&gt;
Widget will be displayed:&lt;br /&gt;
* In the room when a client uses the project&lt;br /&gt;
[[Файл:В_комнате_при_использовании_пользователем_проекта.png|center|thumb|]]&lt;br /&gt;
* In the module settings when it is added to the project:&lt;br /&gt;
[[Файл:И_в_настройках_модуля_при_добавлении_его_в_проект.png ‎|center|thumb|]]&lt;br /&gt;
====Remote и прочие графические окна====&lt;br /&gt;
 &lt;br /&gt;
Remote (пульт управления) и прочие окна - это графическое пространство для управления SubDevice, в отличии от виджета они могут иметь произвольные размеры, позицию и отображается по вызову. Пульт отображается в момент, когда на виджете была нажата кнопка перехода к пульту.&lt;br /&gt;
На пульте управления размещаются элементы управления оборудованием (кнопки, списки, переключатели, уровни). Пультов управления может быть от 0 до нескольких. Пример пульта:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Пульт_управления.png ‎|center|thumb|]]&amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Окно создаётся аналогично виджету, с одним лишь отличием, что при нажатии &amp;quot;Add Popup Page&amp;quot; в параметре &amp;quot;Device Type&amp;quot; надо выбрать &amp;quot;Remote&amp;quot;. &lt;br /&gt;
==Стандарт проектирования интерфейса==&lt;br /&gt;
Для удобства проектирования интерфейса был разработан стандарт, в котором следует разрабатывать графические окна в модуле, чтобы модули разных разработчиков выглядели единообразно в рамках одного проекта.&lt;br /&gt;
===Основные принципы===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:GeneralUI.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Виджет состоит из «Header» и дополнительных модулей основного функционала. &amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» — верхний модуль виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
«Header» содержит:&amp;lt;br/&amp;gt;&lt;br /&gt;
- наименование виджета;&lt;br /&gt;
- наименование устройства, которым&amp;lt;br/&amp;gt;&lt;br /&gt;
управляет виджет;&amp;lt;br/&amp;gt;&lt;br /&gt;
- иконка категории устройства.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Дополнительные модули содержат элементы управления устройством.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Модульная сетка и блоки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Модульная сетка виджета представляет собой блоки 640 pt в ширину&lt;br /&gt;
и 120 pt в высоту. Каждый блок имеет сетку 8х8 pt.&lt;br /&gt;
Скругления углов равно 12,5 ut. (Circle 25)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Принцип построения блока виджета представляет собой конструктор из&lt;br /&gt;
элементов управления (кнопок, свитчей, лэйблов) от меньшего к большему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Setka3.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Элементы управления комбинируются и объединяются в блок,&lt;br /&gt;
а блоки объединяются в панель управления.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопки===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Toggle'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Toggle.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется как в случаях с неизвестным состоянием работы устройства, так и для управления функционалом устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Switch'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Switch.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения «вкл/выкл». Применяется только в случаях с известным состоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Multistate'''&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Multistate.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Кнопка изменения значения предустановленного состояния устройства применяется только в случаях с известным  cостоянием работы устройства.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Кнопка-стрелка===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:arrow2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Действие кнопки'''&amp;lt;br/&amp;gt;&lt;br /&gt;
При нажатии на кнопку происходит вызов «PopUp».&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Содержимое «PopUp»'''&amp;lt;br/&amp;gt;&lt;br /&gt;
«Input field», «Single selection», «Multiple selection».&lt;br /&gt;
===Слайдеры===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Standart&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:StandartSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Value&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ValueSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Progress&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ProgressSlider.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===Описание===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Description.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Иконки===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons1.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Все иконки делятся по сферам применения, и их главное различие — размеры&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:Icons2.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Виджет «header»===&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:WidgetHeader.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Расположение кнопок===&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Форм фактор: 128х120 pt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:FormFactor.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Все кнопки имеют два состояния — покой и активность.&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:OFFicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:ONicon.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
В состоянии покоя цвет кнопки всегда # 848484 или RGB 132&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
Активным состояние кнопки считается только тогда, когда действие получило обратную связь является кратковременным или мгновенным (например: «Play» в медиаплеере) или действие, которое находится в состоянии активности продолжительное время и требует дополнительного воздействия для отключения состояния активности&lt;br /&gt;
(например: «Repeat» в медиаплеере).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Основы работы со скриптами==&lt;br /&gt;
 &lt;br /&gt;
После проектирования интерфейса и добавления драйвера, вам понадобится разработать логику работы модуля в скриптах. Скриптовая часть при разработке i3 lite модуля имеет некоторые особенности.  Перед разработкой скриптовой части lite модуля рекомендуем ознакомиться с [http://dev.iridiummobile.net/JS_Guide iRidium Pro API] и [[Special:MyLanguage/Developers_API | i3 lite API]].  &amp;lt;br /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Модуль может содержать неограниченное количество скриптов.&lt;br /&gt;
Существуют разные типы скриптов для модуля:&lt;br /&gt;
* Driver - в скриптовых файлах данного типа должны содержаться скрипты, отвечающие за работу с драйвером&lt;br /&gt;
* GUI - В этих скриптовых файлах содержатся скрипты, отвечающие за работу с графикой&lt;br /&gt;
* Common - в данных скриптовых файлах должны содержаться скрипты общего характера, тут может быть набор дополнительных функций или описание классов второстепенного назначения&lt;br /&gt;
* Setup - это специальный скриптовой файл, в нем содержиться информация о настройке модуля. а именно - список полей, обязательных для заполнения, типы этих полей и функции проверки правильности введенных данных.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Разделение на типы необходимо для правильной обработки модуля на сервере. На сервере работает только логика и драверная часть модулей, но сервер ничего не знает о графической части. Поэтому разработчику модуля требуется разбивать скрипты по типам. Сервер игнорирует файлы для работы с графической частью. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При разработке модуля следует использовать простраство имен module вместо IR. Таким образом слушатель будет иметь вид module.AddListener(… &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый скриптовой файл должен начинаться со слушателя &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_MODULE_START, 0, function(){});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Это новый вид события, предназначенный специально для разработки модуля. При разработке модуля следует учитывать что скриптовой файл стал закрыт для других скриптовых файлов. Это хзначить что теперь можно использовать одноименные переменные и названия функций в разных скриптовых файлах и они не будут перезаписываться, но это накладывает ограничение: нельзя получить доступ к функции из другого скриптового файла простым способом. Для получения доступа к функции из другого скриптового файла, следует импортировать скриптовый файл с помощью команды module.Import(&amp;quot;FileName.js&amp;quot;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Name_1.js - первый js файл&lt;br /&gt;
this.Text = &amp;quot;Hello, world!&amp;quot;; //Указатель на текстовую переменную&lt;br /&gt;
//Name_2.js - второй js файл&lt;br /&gt;
var Text = module.Import(&amp;quot;Name_1.js&amp;quot;).Text; //Импортируем из первого js файла объект с указателем на текстовую переменную&lt;br /&gt;
IR.Log(Text); //&amp;quot;Hello, world!&amp;quot; //выводим в лог переменную Text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Создание подустройств==&lt;br /&gt;
Основой любого модуля служат подустройства и задачей разработчика модуля является определить сколько подустройств будет в модуле и разработать логику работы подустройств. В состав каждого подустройства может входить виджет, пульт управления, собственный набор действий, событий и состояний. Все составляющие подустройства необходимо указать при его создании. Содержимое подустройства не может меняться в ходе работы модуля. Для создания подустройства используется команда:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddSubDevice(SystemName, [Device], [System], [Type], [Tags], [Name], [Callback]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
,где&amp;lt;br/&amp;gt;&lt;br /&gt;
'''SystemName''' - системное имя подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Device''' - драйвер, к которому будет привязано подустройство&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System''' - устаревший параметр, следует использовать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Type''' - тип smart устройства. Параметр в разработке&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Tags''' - Массив объектов виртуальных тегов&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя подустройства, которое отображается пользователю&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Callback function(){do somethings}''' - функция, которая выполняется до наступления события IR.EVENT_ADD_SUBDEVICE&amp;lt;br/&amp;gt;&lt;br /&gt;
В ответ функция вернет ссылку на подустройство, по которой к нему можно обратиться.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пример создания подустройств для HDL Relay устройств. Скрипт проверяет количество устройств в шине и в цикле создает подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for (var count = 1; count &amp;lt;= COUNT_CHANNEL; count++) {      &lt;br /&gt;
      // Создаем подустройство&lt;br /&gt;
      l_oSubDevice = module.AddSubDevice(&amp;quot;Relay &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_RELAY);       &lt;br /&gt;
      // Создаем команду StatusOnStart&lt;br /&gt;
      if (count == 1) &lt;br /&gt;
         l_oSubDevice.AddChannel(&amp;quot;Relay:statusOnStart&amp;quot;, [ChannelData]);      &lt;br /&gt;
      var l_sChannelName = &amp;quot;Relay:channel&amp;quot; + count;       &lt;br /&gt;
      // Добавляем каналы&lt;br /&gt;
      l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
      l_oSubDevice.AddTag(l_sChannelName, [ChannelData]);      &lt;br /&gt;
      // Добавляем виртуальный тег&lt;br /&gt;
      l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_TAG_POWER, true); &lt;br /&gt;
   };&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким способом можно добавить в подустройство все необходимые сущности. Также, при создании подустройства, активируется событие&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function, [pointer]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
В функцию передается ссылка на только что созданное подустройство. В данном событии можно добавлять к подустройству различные компоненты(действия, события, состояния, виджеты, каналы, теги). Например:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){           &lt;br /&gt;
      Создаем действия&lt;br /&gt;
	  in_oSubDevice.AddAction(&amp;quot;On&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_1&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_ON);                                                                                                     &lt;br /&gt;
      in_oSubDevice.AddAction(&amp;quot;Off&amp;quot;, false, in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, lightID + &amp;quot;_0&amp;quot;, IR.SUB_DEVICE_COMMAND_POWER_OFF);&lt;br /&gt;
      Создаем события&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddEvent(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);         &lt;br /&gt;
      Создаем состояния&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;On&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
      in_oSubDevice.AddCondition(&amp;quot;Off&amp;quot;, &amp;quot;Drivers.PhilipsHue.&amp;quot; + in_oSubDevice.SystemName + &amp;quot;_Power&amp;quot;, false, &amp;quot;==&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
   });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом разработчик может создавать нужное количество подустройств при установке модуля или ручном добавлении новых подустройств&lt;br /&gt;
==Добавление виджетов к подустройству==&lt;br /&gt;
 &lt;br /&gt;
Полсе создания интерфейсов в редакторе и добавления функции добавления подустройств, вам потребуется создавать для каждого поустройства свой экземпляр виджета и привязывать его к подустройству. Для привязки виджета к подустройству используется метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;SubDevice.addWidget(in_Widget)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Входным параметром метода является: '''in_Widget''' - объект - виджет, заранее созданный в редакторе.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt;&lt;br /&gt;
К примеру у нас 3 лампочки и для того, чтобы не создавать для каждой лампочки отдельный виджет, мы воспользуемся уже готовым примером нашего окна и просто будем клонировать его. Напишем пример создания виджета с помощью кода по уже существующему образцу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
Метод Clone позволяет клонировать уже существующее всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;Module.ClonePopup (in_Popup, in_Name)&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Входные параметры метода:&lt;br /&gt;
*'''in_Name''' - имя нового виджета.&amp;lt;br/&amp;gt;&lt;br /&gt;
*'''in_Popup''' - ссылка на всплывающее окно.&amp;lt;br/&amp;gt;&lt;br /&gt;
Выходным параметром метода является: успешно или нет ('''True''', '''False''').&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.AddListener(IR.EVENT_ADD_SUBDEVICE, 0, function(in_oSubDevice){&lt;br /&gt;
 var popup = module.GetPopup(&amp;quot;Dimmer&amp;quot;); // Обращаемся к виджету который собираемся скопировать&lt;br /&gt;
 // Создаем виджет методом клонирования&lt;br /&gt;
 var widget = in_oSubDevice.addWidget(module.ClonePopup(popup, &amp;quot;Dimmer&amp;quot;+ in_oSubDevice.Name));&lt;br /&gt;
 });&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
{{i}} Имена новых виджетов не должны повторяться. &lt;br /&gt;
----&lt;br /&gt;
При открытии полноценного пульта управления из виджета, необходимо помнить о том что пользователь будет запускать модуль как на планшета, так и на телефоне. Из-за разницы в величине экранов, разработчик модуля должен разработать 2 вида окон. Вид под телефонную версию модуля и вид под планшетную версию. При этом надо добавить в скрипт метод, который будет спрашивать у системы вид устройства, на котором запущен модуль, и открывать соответствующее окно&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 if (IR.DisplayType == IR.DISPLAY_TYPE_PHONE) { //Если модуль открыт на телефоне&lt;br /&gt;
    var l_oPopupScanner = module.GetPopup(&amp;quot;Phone&amp;quot;); //Показываем попап, отрисованный для телефона&lt;br /&gt;
  }&lt;br /&gt;
 else {&lt;br /&gt;
   var l_oPopupScanner = module.GetPopup(&amp;quot;Tablet&amp;quot;);//Если планшет, то открываем попап для планшета&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
==Работа с каналами и тегами==&lt;br /&gt;
После создания подустройства и добавления виджета, вам понадобится добавить к подустройству нужные для работы каналы и теги. Как и в версии i3 Pro, драйвер можно добавить в графическом интерфейсе редактора или в скрипте. Для каждого подустройства потребуется собственный набор каналов и тегов для выбранного драйвера. В ходе работы может потребоваться работать с тремя компонентами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*Канал. Для создания канала следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddChannel(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя канала&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Тег. Для создания тега следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddTag(Name, DataArray)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name''' - имя тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''DataArray''' - массив данных, специфичный для каждого драйвера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Виртуальный тег. Для создания виртуального следует использовать метод&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
SubDevice.AddVirtualTag(Name, Value, [Edit], [smartID], [Hidden])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;где,&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Name'''- имя виртуального тега подустройства&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Value''' - Значение тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Edit''' - Разрешение редактирования тега&amp;lt;br/&amp;gt;&lt;br /&gt;
'''smartID''' - Параметр в разработке! Необходимо устанавливать false&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Hidden''' - Признак скрытости тега&amp;lt;br/&amp;gt;&lt;br /&gt;
===Пример создания каналов и тегов при создании подустройства:===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
l_oSubDevice = module.AddSubDevice(&amp;quot;Light &amp;quot; + count, HDL_SERVER, false, IR.SUB_DEVICE_TYPE_THROUGH_DIMMER);&lt;br /&gt;
&lt;br /&gt;
// Adding channel StatusOnStart&lt;br /&gt;
if (count == 1)&lt;br /&gt;
 l_oSubDevice.AddChannel(&amp;quot;Dimmer:statusOnStart&amp;quot;, [ChannelData]);&lt;br /&gt;
&lt;br /&gt;
// Assigned to the variable name of the channel             &lt;br /&gt;
var l_sChannelName = &amp;quot;Dimmer:channel&amp;quot; + count; &lt;br /&gt;
&lt;br /&gt;
// Adding channels&lt;br /&gt;
l_oSubDevice.AddChannel(l_sChannelName, [ChannelData]);&lt;br /&gt;
l_oSubDevice.AddTag(l_sChannelName, [TagData]);&lt;br /&gt;
&lt;br /&gt;
// Adding smart virtual tag&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power On&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_ON, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Power Off&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_POWER_OFF, true);&lt;br /&gt;
l_oSubDevice.AddVirtualTag(&amp;quot;Level&amp;quot;, 0, false, IR.SUB_DEVICE_COMMAND_LEVEL, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Установка модуля в приложение==&lt;br /&gt;
Модули хранятся в магазине модулей iRidium Store и могут устанавливаться в приложение двумя способами:&amp;lt;br/&amp;gt;&lt;br /&gt;
*С помощью сканера&amp;lt;br/&amp;gt;&lt;br /&gt;
*Вручную&amp;lt;br/&amp;gt;&lt;br /&gt;
===Разработка Setup===&lt;br /&gt;
Для любого варианта необходимо разрабатывать файл Setup. Это специальный скриптовой файл, в котором прописаны поля, необходимые для работы модуля. Такими полями могут выступать ip адрес устройства, порт, название города итд. Для разработки Setup необходимо создать новый скриптовый файл и задать его тип &amp;quot;Setup&amp;quot;. Каждое поле является тегом и к нему можно получить доступ из скрипта и получить введенное значение&lt;br /&gt;
&amp;lt;div class=&amp;quot;col-sm-12 col-md-12&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;[[File:СетапБонго.png]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Файл Setup состоит из 2-ух частей. Первая часть это настройки драйверов. В этих настройках следует запрашивать ip адреса, порты и логины, для подключения драйвера у устройству. Вторая часть файла это общие настройки модуля, такие как количество выходов, ключи доступа.&lt;br /&gt;
Для установки поля в Setup необходимо настроить следующие поля в скрипте:&lt;br /&gt;
* Тип поля - надо указать какое поле надо показать пользователю(текстовое поле, массив значений итд. Подробнее описано в API)&lt;br /&gt;
* Имя поля - название поля, которое увидит пользователь при настройке модуля&lt;br /&gt;
* Значение по умолчанию - какое значение следует подставлять по умолчанию&lt;br /&gt;
* Функция проверки - функция валидации значения в поле. Здесь требуется написать функцию, которая будет проверять корректность введенных данных.&lt;br /&gt;
Например, скрипт &amp;quot;Setup&amp;quot; для модуля HDL выглядит следующим образом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	// Data to connect drivers, created in Project Device Panel&lt;br /&gt;
	Drivers: &lt;br /&gt;
	[  &lt;br /&gt;
      {&lt;br /&gt;
         Name: &amp;quot;HDL-BUS Pro Network (UDP)&amp;quot;,&lt;br /&gt;
         Properties: &lt;br /&gt;
         [&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Host&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;255.255.255.255&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                  var l_aValueHost = in_sValue.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                  if (l_aValueHost.length != 4) {&lt;br /&gt;
                     return &amp;quot;Please input correct Host&amp;quot;;                 &lt;br /&gt;
                  } else &lt;br /&gt;
                     if (parseInt(l_aValueHost[0], 10)&amp;gt;=0 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[0], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[1], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[2], 10)&amp;lt;=255 &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;gt;=0  &lt;br /&gt;
                        &amp;amp;&amp;amp; parseInt(l_aValueHost[3], 10)&amp;lt;=255&lt;br /&gt;
                     )&lt;br /&gt;
                        return 0&lt;br /&gt;
                     else&lt;br /&gt;
                        return &amp;quot;Please input correct Host&amp;quot;;   &lt;br /&gt;
               }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
               Name: &amp;quot;Port&amp;quot;,&lt;br /&gt;
               DefaultValue: &amp;quot;6000&amp;quot;,&lt;br /&gt;
               Validation: function(in_sValue) {&lt;br /&gt;
                 if(parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
                     return 0&lt;br /&gt;
                  else&lt;br /&gt;
                     return &amp;quot;Please input correct Port&amp;quot;;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&lt;br /&gt;
	// General information for the module (driver and generated by script)&lt;br /&gt;
	Module: [{&lt;br /&gt;
		Name: &amp;quot;Channels Count&amp;quot;,&lt;br /&gt;
		Validation: function (in_sValue) {&lt;br /&gt;
			if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
				return 0;&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;Please input Count&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
      },&lt;br /&gt;
		{&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;SubnetID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input SubnetID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
      {&lt;br /&gt;
         Type: &amp;quot;textfield&amp;quot;,&lt;br /&gt;
			Name : &amp;quot;DeviceID&amp;quot;,&lt;br /&gt;
			Validation : function (in_sValue) {&lt;br /&gt;
				if (parseInt(in_sValue, 10)&amp;gt;=0)&lt;br /&gt;
					return 0;&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Please input DeviceID&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
  &lt;br /&gt;
	] &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Для получения данных из полей Setup следует использовать функцию&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.GetProperty(&amp;quot;Имя поля&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Помимо стандартных параметров, можно запрашивать любые, необходимые для инициализации модуля, параметры. Параметры драйвера подставляются в драйвер автоматически. Остальные параметры следует запрашивать и использовать вручную&amp;lt;br /&amp;gt;&lt;br /&gt;
Пример работы с параметрами Setup&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var COUNT_CHANNEL = parseInt(module.GetProperty(&amp;quot;Channel count&amp;quot;)); // Getting count channel&lt;br /&gt;
var SubNetID = parseInt(module.GetProperty(&amp;quot;SubnetID&amp;quot;)); // Getting subnet id&lt;br /&gt;
var DeviceID = parseInt(module.GetProperty(&amp;quot;DeviceID&amp;quot;)); // Getting device id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Установка модуля вручную===&lt;br /&gt;
===Установка модуля с помощью сканера===&lt;br /&gt;
===Ручное добавление подустройств===&lt;br /&gt;
===Авторизация===&lt;br /&gt;
===Смена настроек===&lt;br /&gt;
===Удаление модуля===&lt;/div&gt;</summary>
		<author><name>Ildar</name></author>	</entry>

	</feed>