Internal and External connection switching

You can not pre-set Local and External connection settings in the driver settings of your project, but with JS you can create a buttons which will reset a connection settings of the drivers in your Project Tree.
You can see an examples for your equipment here:

 

Channel properties, driver properties

At the moment you can not read or write:
  • properties of command, created via the GUI Editor in the project Tree. You can only call this command by the name.
You can writhe, but can not read:
  • connection settings of driver, created in the Project tree or via the script.

HTTP standard driver wait response

When you send the HTTP command via the script, for example
IR.GetDevice('DEVICE').Send(['GET,/remoteAction=11,']);
This command make some action. But if the controlled device doesn't confirm the command receiving by some response, driver will wait for this response about 5 seconds. In this 5 seconds you can not send any other commands to the device.
The driver is not waiting for 5 seconds becauseit is getting something back from the device.

The problem is that the HTTP driver waits for data anyway, the variant without data after the request was not provided.
You can use TCP driver instead of HTTP to send commands, it is not waiting for ~5 seconds.

Example of HTTP request
GET /wiki/HTTP HTTP/1.0\r\n
Host: ru.wikipedia.org\r\n
\r\n
Example for iRidium (TCP):
IR.GetDevice("DEVICE").Send(['GET /wiki/HTTP HTTP/1.0\r\nHost: ru.wikipedia.org\r\n\r\n']);

Adding multiple copies of the same custom device driver in a project

The most part of drivers has a system of "items", allows you to use the same script for a multiple physical devices. This items stored (in general) in the end of script file.

By default you have one item:
var mydevice = new Marantz_sr7007_main("Marantz SR7007_first_device");
If you need to make 1 or 2 more items:
var mydevice1 = new Marantz_sr7007_main("Marantz SR7007_first_device");
var mydevice2 = new Marantz_sr7007_main("Marantz SR7007_second_device");
var mydevice3 = new Marantz_sr7007_main("Marantz SR7007_third_device");

What is the difference between "Built-in iRidium drivers" and "JS Modules"?

Built-in (native) drivers are included in the standard iRidium base. Such drivers are quickly set up in GUI Editor. They are standardized and are provided with detailed instructions and examples.

Script drivers are always created on the base of the native AV & Custom Systems driver with the help of iRidium scripts (the programming language based on Java Script). They are used for controlling any systems which are not included int he standard iRidium base.

Usually the script drivers are distributed with the visualization project (for example, XBMC, Sonos, iTunes, ... ).

Javascript syntax checking

To debug without the 'syntax check',  make sure the log is set to start when the emulator starts (Tools | Options | Emulator | Show log at emulator start) and then run the emulator
If the script has an error in it, the start of the log will tell you, along with which line the error is on.

Logging Affects Performance of your projects

Please be aware of the fact that IR.Log calls in iRidium script will affect performance and should only be used when you are creating\developing  or troubleshooting your projects.  

This is relevant for low power devices ( IOS \ Android ) given their limited CPU power.

Before uploading a project which is to go into an live installation,  it recommended to search through the scripts in your project and comment out the logging lines (using \\  at the beginning of the IR.Log line).

"IF" and "ELSE IF" conditions for Tag Change Event. Show Popup when the Driver Feedback = 1

Here is an Example for Modbus Driver.
The Modbus structure is not an "event based". It sends the value from each Feedback to iRidium each second, so the TAG_CHANGE_EVENT fires every time for the same value. It is not good when you use TAG_CHANGE_EVENT to make some action like Show Popup when the channel goes to 1 (popup showed every second in this case).

You can use an additional condition which triggering channel only ones, when it changes value from X to Y.

Example: "Show Popup when the Modbus Feedback = 1"

var reject = 0; // it locks the condition when the value not really changes

IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus (TCP)"), function(name,value)
{
   if  (name == "Feedback 1" && value == 0) // feedback changes from 1 to 0
   {
      reject = 0; 
   }

  else if (name == "Command 2" && value == 1 && reject == 0) // feedback changes from 0 to 1 or it stays 1 for some time
  {
      IR.ShowPopup('Popup 1');
      reject = 1;
  }
});

OpenPopupOnChange.irpz

"OR" condition. Turn on the Item if one of feedbacks is not a zero

Use the script attached to work with the list of Feedback or List of Tokens by the OR condition.
You can use it, for example, when you need to activate item or make an action only if one of the feedbacks from the list > 0:

var deviceName = "KNX"; // Driver Name
var ChannelBuff = ['Dimmer', 'f32', 'u32', 's32', 'u16', 's16']; // List of Feedbacks
var projectToken = "MyProjectToken"; // Project Token name
  
function CheckChannels(DeviceID, _ChannelBuff, _Token)
{
  DeviceID = IR.GetDevice(DeviceID);  // Get the device ID

  for (var i = 0; i <= _ChannelBuff.length - 1; i++) // Check the Feedbacks
   
 if(DeviceID.GetFeedback(_ChannelBuff[i]) > 0) // If the Feedback > 0, then write 1 to Project Token
         IR.SetVariable("Global." + projectToken, 1)
}

IR.AddListener(IR.EVENT_TAG_CHANGE , IR.GetDevice(deviceName), function(name,value)
{
   IR.SetVariable("Global." + projectToken, 0);
   CheckChannels(deviceName, ChannelBuff, projectToken);
})
 

ONifOneTokenNotAzero.irpz
ONifOneChannelNotAzero.irpz

"IF" and "ELSE IF" for the data received. Change Item by receiving some Value

You have to to use this example to make a condition in your script:

if (condition1 && condition2)
{
    <action>
};

Conditions in iRidium must be performed inside of EVENTS, which allows you to use some  data, generated by events:

IR.AddListener(IR.EVENT_TAG_CHANGE , IR.GetDevice("MyDriver"), function(name,value)
{
      <action>
});

EVENT_TAG_CHANGE sends you a name and value of the Driver's Feedback in your project, which changes now. So, you can use a name of the feedback and value of this feedback in your conditions.

IR.AddListener(IR.EVENT_TAG_CHANGE , IR.GetDevice("MyDriver"), function(name,value)
{
      if (name == "Feedback 1" && value == 100)
   {
      IR.Log("got 100 from Feedback 1");
      IR.GetItem("Page 1").GetItem("Item 1").Value = 1; //got 100 but set 1 in Item
    }

      else if ()
   {
       IR.Log("got something else");
    } 
});

Pass an HTTP request variable in JSON format

When you send JSON  object, then you must convert JSON object to string. For convert JSON  object to string - please use function SON.Stringify

Description:
http://wiki2.iridiummobile.ru/Drivers_API#JSON.Stringify

Example:
device.Send(['PUT,/api\r\n\HTTP/1.1,' + JSON.Stringify(request) + ',\r\n\r\n']);

error body
contains invalid json - this answer from server. Maybe missed char end of line ',\r\n\r\n'.

Send command only via the script

Open Project Device Panel, select Driver, and change field Script Mode = Script Only
Image

How_Fixed.png

Send command in HEX

Data are received from Telegram token in HEX format. The problem is that the function  that.device.Send sends data in ASCII, not in HEX and then a wrong message is sent.

IR.AddListener(IR.EVENT_CHANNEL_SET,that.device,function(name)    
{
       that.Msg = IR.GetVariable("Drivers."+that.DriverName+".Telegram"); 
       //Msg string will be "7F F2 FA 00 01 00 BD 67 FA FF FE 06 87 0D"
       IR.Log("Driver: Msg = "+ that.Msg);
       that.device.Send([that.Msg]);   
 }); 
You can use something like
var value = parseInt("FF", 16);
to convert a hex string to a hex number
for(var cnt=0;cnt               
{
	partMSG=telegram.substring(cnt,cnt+2);
	partTel = parseInt(partMSG, 16);
	that.device.Send([partTel]);
}                 

HTTP Send Command

To send the HTTP command via the script please use a following syntax
  IR.GetDevice("DEVICE").Send(['GET,getverion\r\n HTTP 1.1', '\r\n\r\n']);

  IR.GetDevice("DEVICE").Send(['PUT,getverion\r\n HTTP 1.1', '\r\n\r\n']);
 
  IR.GetDevice("DEVICE").Send(['POST,getverion\r\n HTTP 1.1', '\r\n\r\n']);

Device.Send(['GET,/data/path/data.xml,']);
use "," for end of string


Send several ir codes from a slider

Please take a look at the attached project, your IR commands have to be defined in the IRCodes array in the SendIR script.

LevelIR__1_.irpz

Notifications for iOS

The iRidium notification system MUST NOT be used as the main one! iRidium notifications about important and potentially dangerous situations can be used as an auxiliary system to SMS, e-mail, notifications of the security system, etc.

At the moment notifications for the background mode (minimized or closed application) are not supported.

1. Notify about disconnecting from equipment (Offline)
/***** online notification ****/
IR.AddListener(IR.EVENT_OFFLINE, IR.GetDevice("My Driver"), function() 
{
	IR.GetItem("Page 1").GetItem("Item 1").Text = IR.GetVariable("System.Time.24") + " System Offline";  // notification
	IR.GetItem("Page 1").GetItem("Item 1").GetState(0).TextColor = 0xFF0000FF;  // text color
});
3. Automatic opening of the popup when activating a channel
/***** event notification (Tag Change) ****/
var old_value1 = -1;  // do not show notification if the previous state is the same  
var old_value2 = -1; 

IR.AddListener(IR.EVENT_START, 0, function()
{
	IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("My Driver"), function(name, value)
	{
	if (name == 'Channel 10' && value == 1 && value != old_value1){ // Check the Value = 1 in Feedback "Channel 10"
		IR.ShowPopup("Notify_danger");
		IR.GetItem("Popup 1").GetItem("Item_Display").Text = IR.GetVariable("System.Time.24") + " Lamp in Garden broken";  
		old_value1 = value;  
	}

	else if (name == 'Channel 10' && value == 2 && value != old_value2){  // Check the feedback "Channel 10'"
		IR.ShowPopup("Notify_important");
		IR.GetItem("Popup 1").GetItem("Item_Display").Text = IR.GetVariable("System.Time.24") + " Lamp in Garden Response Failed. Please Check";  
		old_value2 = value;
	}  
});
4. Play a sound at channel activation
/***** event notification (Tag Change) ****/
IR.AddListener(IR.EVENT_START, 0, function()
{
	IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("My Driver"), function(name, value)
	{
	if (name == 'Channel 11' && value == 1){ // Check the Value = 1 in Feedback "Channel 11"
	IR.PlaySound('BEEP1.WAV',1,70); // Play Sound ('name',slot,volume)
	IR.GetItem("Page 1").GetItem("Item 5").Text = IR.GetVariable("System.Time.24") + " Incoming Call";  
}  
});

Parallax Effect (3D background in the project)


Use the script from example to make a Parallax Effect for your projects background.
Background Image should be bigger than the base page

Parallax_Effect.irpz

Custom Password in GUI for secured Page

If you want to create custom "edit box" item to secure access to some page of GUI,

you can use this script (see attachment, script is in the "JS" tab in GUI Editor)


Lists and Single/Double Tap on list item distinguishing

Hi everybody, 


I decided to write this post as I haven't found any clear solutions for the tasks I met. Writing a driver for Autonomic Mirage Media Server (MMS) I faced the necessity to provide a good way for the user to manage content of the media server so that the user could find and select the media to include into 'now playing' list. Imagine the following situation. A user wants to find a content to play by genre. I want to show on the popup both the list of genres as well as the list of albums related to the selected genre. Once the user choose a specific album, I want to show both the list of albums, related to the selected genre, as well as the list of songs within the selected album. Of course there are a number of ways how to organize that but I didn't want to have a mess of popups and I wanted the user to clearly understand the 'chain'. 

Thus I decided to do the following. A created a popup with a static list of 'list' popups. At once only two 'list' popups are visible. Once the user chooses the item in the left list within the 'list' popup, I scroll the static list so that the right 'list' popup becomes the left one and the third 'list' popup becomes visible... I didn't use the practice to populate a single list with different data as in a real life so called 'list popups' will have completely different layout.        


One more thing to be mentioned: I wanted to distinguish a single tap on the list item from a double tap and do different things. For instance I wanted to show special popup on the double tap on the item so that the user could choose whether to play the album/song immediately or just add it to the playlist.


In the attached project there are both technics are shown. Probably there is an easier way to do the same or I reinvented the wheel...


Vladimir Makarov


NestedLists.irpz