0.0.1 • Published 7 years ago

hm-webui-javascript v0.0.1

Weekly downloads
1
License
MIT
Repository
github
Last release
7 years ago

Logo

HM WebUI Javascript Plugin

With the plugin you can run Javascript or Coffescript code triggered by a state change of a device or triggered by a scheduler.

When you write code the following objects / functions support you.

Global objects

The follwoing global objects can be used in the code

log

With the log object functions you can write messages to the log file with the given severity. The log messages will be written to log file only when the severity matches to the log level set on the plugin configuration by the user.

When the user set the log level of the plugin to ERROR only messages with log.error() will be written to the HM WebUI log. If the user set the log level of the plugin to VERBOSE all higher messages with log.error(), log.warn(), log.info() and log.verbose() will be written to the log file.

log.error(message)
log.warn(message)
log.info(message)
log.verbose(message)
log.debug(message)
log.silly(message)

hmwebui

The hmwebui object has functions to read or write data from the HM WebUI system and some supporting function to subscribe to state events or create a scheduler.

All the hmwebui functions return a promise with the following functions:

  • .then() - When the request was successful
  • .fail() - When an error occurred
  • .fin() - Always (if an error occured or the request was successful)

You can combine the functions in the following way:

hmwebui.getPlugins('device').then(function(result){
  ... your code here for successful call
}).fail(function(err){
  ... your code here when an error occurred
}).fin(function(){
  ... your code here that should run always
});

getPlugins(type,status)

The getPlugins function is returning a list of configured plugins.

Parameter

nametyperequiredcomment
typestringnoreturning all plugins with the given type
statusstringnopossible values: starting, running, stopping, stopped

Result

An object with plugin data.

{
  id: <unique id of the plugin instance e.g. hm-webui-httprequest.0>,
  pluginId: <the id of the plugin e.g. hm-webui-httprequest>,
  status: <plugin status>
  ...
}

Example

hmwebui.getPlugins('device').then(function(plugins){
  /*
    the plugins array list contains a list of all device plugins
    with the type 'device'
  */
  ...
});

hmwebui.getPlugins('device','running').then(function(plugins){
  /*
    the plugins array list contains a list of all device plugins
    with the type 'device' that are currently running
  */
  ...
});

callPluginFunction(pluginId,functionName,arg1,arg2,...)

The callPluginFunction is used to call a function of a configured plugin. It depends on the plugin function how many argn parameter you have to provide. See the documentation of the plugin to see which functions you can call.

Parameter

nametyperequiredcomment
pluginIdstringyesthe id of the plugin to call the function (can be retrieved with the getPluginsFunction or is visible in the plugin list of the Admin GUI)
functionNamestringyesthe name of the function to call
argnanynothe arguments to call the function (read plugin documentation)

Result

Depends on the plugin function (read plugin documentation for details)

Example

//call the get function of the httprequest plugin
hmwebui.callPluginFunction('hm-webui-httprequest.0','get','http://www.google.com')
.then(function(result){
  /*
    the result contains the body (html) of the get request
    for more information about the content of the request object
    read the plugin documentation for the hm-webui-httprequest plugin
  */
  ...
})
.fail(function(err){
  //the err contains the error messages
  log.error(err);
});

getDeviceList(selector)

This function returns a list of devices matching the given selector

Parameter

nametyperequiredcomment
selectorstringnothe selector to match the devices (for detailed description see below). If no selector is given all devices are returned

Selector parameter

The selector parameter is a string to match the devices. Right now you can match device attributes. All attributes are combined with a AND condition. The selector should be in the following format:

[<attribute>=<value to search for>][<attribute>=<regexp to search for>] ...

As attribute value you could provide a string or a regular expression to match a device attribute.

Result

An array list containing all matched device objects.

Example

//get a list of devices where the type attribute is 'Window'or 'Door'
hmwebui.getDeviceList([type=/Window|Door/]).then(function(list){
  //list is an array list with the device objects matching the selector
  ...
});

/* get a list of devices where the type attribute is 'Window'or 'Door'
    and the pluginId is 'hm-webui-homematic.0' */
hmwebui.getDeviceList([type=/Window|Door/][pluginId='hm-webui-homematic.0']).then(function(list){
  //list is an array list with the device objects matching the selector
  ...
});

getDevice(pluginId,address)

This function returns a device object.

Parameter

nametyperequiredcomment
pluginIdstringnothe id of the plugin to get the device (can be retrieved with the getPluginsFunction or is visible in the plugin list of the Admin GUI).If no pluginId is provided all plugins will be queried for the given address.

Result

An object with the device data

{
    address: <the device address>,
    name: <the name of the device>,
    type: <the type of the device>,
    pluginId: <the plugin id providing the device>,
    channels: {
        ...
    },
    visible: <true or false>,
    editable: <true or false>,
    deletable: <true or false>
    ...
}

Example

//get the device data for address 'MEQ32546'
hmwebui.getDevice('MEQ32546').then(function(device){
  //device is the device object data
  ...
});

//get the device data for address 'MEQ32546' of the 'hm-webui-homematic.0' plugin
hmwebui.getDevice('hm-webui-homematic.0','MEQ32546').then(function(device){
  //device is the device object data
  ...
});

getState(pluginId,address)

With this function you can retrieve one or multiple state value(s) (depends on the address parameter).

Parameter

nametyperequiredcomment
pluginIdstringnothe id of the plugin to call the function (can be retrieved with the getPluginsFunction or is visible in the plugin list of the Admin GUI).If no pluginId is provided all plugins will be queried for the given address.
addressstring array objectyesfor detailed description see below

Address parameter

If the address is a string it should have the following format:

<device address>.<channel>.<state>

You can retrieve one state value with an address parameter given as string.

If you provide an array of strings as address parameter you retrieve a list of state values in the same order as the address array. The strings should have the same format as for a single state address (see above).

If you provide an object it should have the following format:

{
  <key>:<state address>,
  <key1>:<state address1>,
  ...
}

The result is an object with key / value pairs. The key is the key you gave to the address (see above). For the example above the result will be:

{
  <key>:<state value>,
  <key1>:<state value1>,
  ...
}

Example

//get a single state value for state address 'MEQ32546.1.STATE'
hmwebui.getState('MEQ32546.1.STATE').then(function(state){
  //state contains the value for 'MEQ32546.1.STATE'
  ...
});

//get a single state value for state address 'MEQ32546.1.STATE' of the 'hm-webui-homematic.0' plugin
hmwebui.getState('hm-webui-homematic.0','MEQ32546.1.STATE').then(function(state){
  //state contains the value for 'MEQ32546.1.STATE'
  ...
});

//get a list of state values
hmwebui.getState(['MEQ32546.1.STATE','MEQ88888.1.STATE']).then(function(states){
  /*
    states contains an array list of states in the same order
    as the addresses e.g.
    [1,0]
  */
  ...
});

//get a key / value list of state values
hmwebui.getState({
  state1: 'MEQ32546.1.STATE',
  state2: 'MEQ88888.1.STATE'
}).then(function(states){
  /*
    states contains key / value list of states e.g.
    { state1: 1, state2: 0 }
  */
  ...
});

setState(pluginId,address,value)

With this function you can set one or state value for the provided address.

Parameter

nametyperequiredcomment
pluginIdstringnothe id of the plugin to call the function (can be retrieved with the getPluginsFunction or is visible in the plugin list of the Admin GUI).If no pluginId is provided all plugins will be queried to set the state for the given address.
addressstringyesfor detailed description see below
valuestring number booleanyesthe value to set

Address parameter

The address is a string and should have the following format:

<device address>.<channel>.<state>

Result

true on success or false on failure

Example

//set the state 'MEQ32546.1.STATE' to true
hmwebui.setState('MEQ32546.1.STATE',true).then(function(result){
  //result is true on success or false on failure
  ...
});

//set the state 'MEQ32546.1.STATE' of the 'hm-webui-homematic.0' plugin to 0
hmwebui.setState('hm-webui-homematic.0','MEQ32546.1.STATE',0).then(function(result){
  //result is true on success or false on failure
  ...
});

on(pattern)

With this function you add a subscription to a state event defined by the given pattern.

Parameter

nametyperequiredcomment
patternobjectyesa pattern object to define the sate event to subscribe (for detailed description see below / Object matcher)

Object matcher

You have to provide an object (key / value pairs) as pattern with the following possible parameter.

keytypecomment
logicstringlogic to combine the condition keys. Possible values are and (default) or
changestringpossible values are ne (default) - (not equal) New value must be not equal to the old one (value != oldState.value) eq - (equal) New value must be equal to old one (value == oldState.value) gt - (greater than) New value must be greater than old value (value > oldState.value) ge - (greater or equal) New value must be greater or equal to old one (value >= oldState.value) lt - (lower than) New value must be lower than old one (value < oldState.value) le - (lower or equal) New value must be lower or equal to old value (value <= oldState.value)
valanyNew value must be equal to the given value
valNeanyNew value must be not equal to the given value
valGtanyNew value must be greater than the given value
valGeanyNew value must be greater than or equal to the given value
valLtanyNew value must be lower than the given value
valLeanyNew value must be lower than or equal to the given value
oldValanyOld value must be equal to the given value
oldValNeanyOld value must be not equal to the given value
oldValGtanyOld value must be greater than the given value
oldValGeanyOld value must be greater than or equal to the given value
oldValLtanyOld value must be lower than the given value
oldValLeanyOld value must be lower than or equal to the given value
statestring RegExpThe state id of the event must match the given string or regular expression. The string can have a * at the beginning and/or end e.g. ST* - to match all states beginning with ST *AT - to match all states ending with AT
addressstring RegExpThe address of the event must match the given string or regular expression. The string can have a * at the beginning and/or end e.g. ADDR* - to match all addresses beginning with ADDR *ESS - to match all addresses ending with ESS
channelstring RegExpThe channel of the event must match the given string or regular expression. The string can have a * at the beginning and/or end e.g. CHA* - to match all channels beginning with CHA *NNEL - to match all channels ending with NNEL
pluginIdstring RegExpThe pluginId of the event must match the given string or regular expression. The string can have a * at the beginning and/or end e.g. hm-webui* - to match all pluginIds beginning with hm-webui *httprequest - to match all pluginIds ending with httprequest
deviceobjecta object to match device values of the event with the following keys: name - a string or RegExp. The device name of the event must match the given name type - a string or RegExp. The device type of the event must match the given type

Result

The result is an event object. It depends on the device plugin what kind of information is provided for the event but at least the following fields should be in the object:

{
  address: <device address>,
  channel: <channel id>,
  state: <state id>,
  value: <state new value>,
  timestamp: <value change timestamp as unix timestamp>,
  oldState: <object containing the old state | optional>,
  device: <object with detailed device data | optional>
}

Example

//match all events where the state starts with STA* and the device type matches the given regular expression
hmwebui.on({ state: 'STA*', device: { type: /HM-Sec-SCo/ } }).then(function(event){
  //result is an event object
  ...
});

//match all events where state is STATE and the new value is true
hmwebui.on({ state: 'STATE', val: true }).then(function(event){
  //result is an event object
  ...
});

//match all events where state is STATE and the new value is greater than the old value
hmwebui.on({ state: 'STATE', change: 'gt' }).then(function(event){
  //result is an event object
  ...
});

subscribe(pattern)

Alias for the on(pattern) function

schedule(pattern)

Schedule a function to run on the given pattern.

Parameter

nametyperequiredcomment
patternstring objectyessee Cron expression and Object expression below for details

For more details on the expressions visit the nodejs-schedule project page

Cron expression

The pattern can be a cron expression in the following format

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    |
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
hmwebui.schedule('*/5 * * * *').then(function(){
  //the function is called every 5 minutes
});

Object expression

To make things a little easier, an object expression is also supported.

hmwebui.schedule({hour: 14, minute: 30, dayOfWeek: 0}).then(function(){
  //the function is called every Sunday at 2:30pm
});

Returns

As all other functions the schedule function returns a promise with .then() .fail() and .fin() functions. But ist also has a scheduler property holding the instance of the schedule. This is e.g. needed if you want to cancel a schedule.

var sched = hmwebui.schedule({hour: 14, minute: 30, dayOfWeek: 0}).then(function(){
  //the function is called every Sunday at 2:30pm
});

//cancel the scheduler
sched.scheduler.cancel()

exec(cmd)

Execute a command on the system HM WebUi is running on.

Parameter

nametyperequiredcomment
cmdstringyesthe command to execute e.g. ls /var/log - to list files in the /var/log directory

Result

the ouput of the system command

Example

hmwebui.exec('ls /var/log').then(function(result){
  //result holds the output of the command (stdout)
}).fail(function(err){
  //err contains the error returned by the command if something failed
});

writeConfigJSON(file,data)

Write an data to the config store of the plugin instance.

Parameter

nametyperequiredcomment
filestringyesthe filename of the config file to write to
dataobjectyesthe object data to write to the config stopServer

Example

hmwebui.writeConfigJSON('test.json',{id: 1, name: 'Test'}).then(function(){
  //there is no result on success
}).fail(function(err){
  //error message when something went wrong
});

readConfigJSON(file)

Read a JSON object from the config store of the plugin instance.

Parameter

nametyperequiredcomment
filestringyesthe filename of the config file to read

Result

a JSON object from the config file

Example

hmwebui.readConfigJSON('test.json').then(function(result){
  //result is the JSON object from the config file
}).fail(function(err){
  //error message when something went wrong
});

Global functions

The follwoing global functions can be used in the code

importScript(name)

This function can be used in a script to import another script in the same plugin. It is not possible to import scripts of other plugins. The code of the imported script will be copied to the position where the importScript() function is in the code.

To avoid confusion on an error put the importScript() function always at the end of the main code (the line numbers could be different in the error message when you import the script in the middle of the code).

Parameter

nametyperequiredcomment
namestringyesthe name of the script to import

Example

//import the script 'Test Script' here
importScript('Test Script');

setInterval(callback,,ms,arg1,arg2,...,argN)

The method calls a function or evaluates an expression at specified intervals (in milliseconds).

For support of the javascript standard setInterval function you can provide as first argument a callback. If you omit the timeout the function is returning a promise that is called after the milliseconds.

Parameter

nametyperequiredcomment
callbackfunctionnothe function to execute; as argruments the arg1 ... argN is passed to the function
msintegeryesthe milliseconds to repeat the code

Returns

If a callback function is provided it returns the id of the interval. If no callback function is provided it returns a promise and the .then() function of the promise is called on every interval. The arguments passed to the .then() function are the arg1 ... argN. The promise also contains a reference to the interval id.

var intervalId = setInterval(10).interval;

Example

//run the function every 5 seconds
var intervalId = setInterval(function(){
    log.info('Five seconds are over');
},5000);

//run the function every 5 seconds
var intervalId = setInterval(5000).then(function(){
    log.info('Five seconds are over');
}).interval;

clearInterval(intervalId)

This method deletes an interval

Parameter

nametyperequiredcomment
intervalIdintegeryesthe the id of the interval returned by the setInterval function

Example

//run the function after 5 seconds
var intervalId = setInterval(5000).then(function(){
    log.info('Five seconds are over');
}).interval;

//clear the interval
clearInterval(intervalId);

setTimeout(callback,,ms,arg1,arg2,...,argN)

The method calls a function or evaluates an expression after a specified number of milliseconds. For support of the javascript standard setTimeout function you can provide as first argument a callback. If you omit the timeout the function is returning a promise that is called after the milliseconds

Parameter

nametyperequiredcomment
callbackfunctionnothe function to execute; as argruments the arg1 ... argN is passed to the function
msintegeryesthe number of milliseconds to wait before executing the code

Returns

If a callback function is provided it returns the id of the timeout. If no callback function is provided it returns a promise and the .then() function of the promise is called after the timeout. The arguments passed to the .then() function are the arg1 ... argN. The promise also contains a reference to the timeout id.

var timeoutId = setTimeout(10).timeout;

Example

//run the function after 5 seconds
var timeoutId = setTimeout(function(){
    log.info('Five seconds are over');
},5000);

//run the function after 5 seconds
var timeoutId = setTimeout(5000).then(function(){
    log.info('Five seconds are over');
}).timeout;

clearTimeout(timeoutId)

This method deletes a timeout

Parameter

nametyperequiredcomment
timeoutIdintegeryesthe the id of the timeout returned by the setTimeout function

Example

//run the function after 5 seconds
var timeoutId = setTimeout(5000).then(function(){
    log.info('Five seconds are over');
}).timeout;

//clear the timeout
clearTimeout(timeoutId);

Changelog

0.0.1 (2017-01-08)

  • initial version