diff --git a/README.md b/README.md index 651a24517..57f4d4137 100644 --- a/README.md +++ b/README.md @@ -1168,7 +1168,8 @@ See [Examples](#rule-builder-examples) for further patterns. - `.channel(channelName)` Specifies a channel event as a source for the rule to fire. - `.triggered(event)` Trigger on a specific event name - `.cron(cronExpression)` Specifies a cron schedule for the rule to fire. - - `.item(itemName)` Specifies an item as the source of changes to trigger a rule. + - `.timeOfDay(time)` Specifies a time of day in `HH:mm` for the rule to fire. + - `.item(itemName)` Specifies an Item as the source of changes to trigger a rule. - `.for(duration)` - `.from(state)` - `.to(state)` @@ -1176,7 +1177,7 @@ See [Examples](#rule-builder-examples) for further patterns. - `.toOn()` - `.receivedCommand()` - `.receivedUpdate()` - - `.memberOf(groupName)` + - `.memberOf(groupName)` Specifies a group Item as the source of changes to trigger the rule. - `.for(duration)` - `.from(state)` - `.to(state)` @@ -1184,18 +1185,20 @@ See [Examples](#rule-builder-examples) for further patterns. - `.toOn()` - `.receivedCommand()` - `.receivedUpdate()` - - `.system()` + - `.system()` Specifies a system event as a source for the rule to fire. - `.ruleEngineStarted()` - `.rulesLoaded()` - `.startupComplete()` - `.thingsInitialized()` - `.userInterfacesStarted()` - `.startLevel(level)` - - `.thing(thingName)` + - `.thing(thingName)` Specifies a Thing event as a source for the rule to fire. - `changed()` - `updated()` - `from(state)` - `to(state)` + - `.dateTime(itemName)` Specifies a DateTime Item whose (optional) date and time schedule the rule to fire. + - `.timeOnly()` Only the time of the Item should be compared, the date should be ignored. Additionally, all the above triggers have the following functions: @@ -1230,31 +1233,34 @@ Additionally, all the above triggers have the following functions: ```javascript // Basic rule, when the BedroomLight1 is changed, run a custom function rules.when().item('BedroomLight1').changed().then(e => { - console.log("BedroomLight1 state", e.newState) + console.log("BedroomLight1 state", e.newState) }).build(); -// Turn on the kitchen light at SUNSET -rules.when().timeOfDay("SUNSET").then().sendOn().toItem("KitchenLight").build("Sunset Rule","turn on the kitchen light at SUNSET"); +// Turn on the kitchen light at SUNSET (using the Astro binding) +rules.when().channel('astro:sun:home:set#event').triggered('START').then().sendOn().toItem('KitchenLight').build('Sunset Rule', 'Turn on the kitchen light at SUNSET'); // Turn off the kitchen light at 9PM and tag rule -rules.when().cron("0 0 21 * * ?").then().sendOff().toItem("KitchenLight").build("9PM Rule", "turn off the kitchen light at 9PM", ["Tag1", "Tag2"]); +rules.when().timeOfDay('21:00').then().sendOff().toItem('KitchenLight').build('9PM Rule', 'Turn off the kitchen light at 9PM', ['Tag1', 'Tag2']); // Set the colour of the hall light to pink at 9PM, tag rule and use a custom ID -rules.when().cron("0 0 21 * * ?").then().send("300,100,100").toItem("HallLight").build("Pink Rule", "set the colour of the hall light to pink at 9PM", ["Tag1", "Tag2"], "MyCustomID"); +rules.when().cron('0 0 21 * * ?').then().send('300,100,100').toItem('HallLight').build('Pink Rule', 'Set the colour of the hall light to pink at 9PM', ['Tag1', 'Tag2'], 'MyCustomID'); // When the switch S1 status changes to ON, then turn on the HallLight -rules.when().item('S1').changed().toOn().then(sendOn().toItem('HallLight')).build("S1 Rule"); +rules.when().item('S1').changed().toOn().then().sendOn().toItem('HallLight').build('S1 Rule'); // When the HallLight colour changes pink, if the function fn returns true, then toggle the state of the OutsideLight -rules.when().item('HallLight').changed().to("300,100,100").if(fn).then().sendToggle().toItem('OutsideLight').build(); +rules.when().item('HallLight').changed().to('300,100,100').if(fn).then().sendToggle().toItem('OutsideLight').build(); + +// Turn on the outdoor lights based on a DateTime Item's time portion +rules.when().dateTime('OutdoorLights_OffTime').timeOnly().then().sendOff().toItem('OutdoorLights').build('Outdoor Lights off'); // And some rules which can be toggled by the items created in the 'gRules' Group: // When the HallLight receives a command, send the same command to the KitchenLight -rules.when().item('HallLight').receivedCommand().then().sendIt().toItem('KitchenLight').build("Hall Light", ""); +rules.when(true).item('HallLight').receivedCommand().then().sendIt().toItem('KitchenLight').build('Hall Light to Kitchen Light'); // When the HallLight is updated to ON, make sure that BedroomLight1 is set to the same state as the BedroomLight2 -rules.when().item('HallLight').receivedUpdate().then().copyState().fromItem('BedroomLight1').toItem('BedroomLight2').build(); +rules.when(true).item('HallLight').receivedUpdate().then().copyState().fromItem('BedroomLight1').toItem('BedroomLight2').build(); ``` ### Event Object diff --git a/rules/condition-builder.js b/rules/condition-builder.js index 767eb0c63..945a1a7df 100644 --- a/rules/condition-builder.js +++ b/rules/condition-builder.js @@ -14,6 +14,7 @@ class ConditionBuilder { this._fn = fn; } + /** @private */ _then (condition, fn) { this._builder.setCondition(condition); return new operations.OperationBuilder(this._builder, fn); @@ -22,7 +23,7 @@ class ConditionBuilder { /** * Move to the rule operations * - * @param {*} function the optional function to execute + * @param {*} fn the optional function to execute * @returns {operations.OperationBuilder} */ then (fn) { @@ -53,12 +54,13 @@ class ConditionBuilder { */ class ConditionConf { constructor (conditionBuilder) { + /** @private */ this.conditionBuilder = conditionBuilder; } /** * - * @param {*} function an optional function + * @param {*} fn an optional function * @returns ConditionBuilder */ then (fn) { @@ -81,6 +83,7 @@ class FunctionConditionConf extends ConditionConf { */ constructor (fn, conditionBuilder) { super(conditionBuilder); + /** @private */ this.fn = fn; } @@ -92,8 +95,7 @@ class FunctionConditionConf extends ConditionConf { * @returns {boolean} true only if the operations should be run */ check (...args) { - const answer = this.fn(args); - return answer; + return this.fn(args); } } @@ -107,11 +109,12 @@ class FunctionConditionConf extends ConditionConf { class ItemStateConditionConf extends ConditionConf { constructor (itemName, conditionBuilder) { super(conditionBuilder); + /** @private */ this.item_name = itemName; } /** - * Checks if item state is equal to vlaue + * Checks if item state is equal to value * @param {*} value * @returns {this} */ diff --git a/rules/operation-builder.js b/rules/operation-builder.js index d4d013628..c63a8f955 100644 --- a/rules/operation-builder.js +++ b/rules/operation-builder.js @@ -18,12 +18,14 @@ class OperationBuilder { this._fn = fn; } + /** @private */ _finishErr () { if (this._fn) { throw new Error('rule already completed'); } } + /** @private */ _then (operation, group, name, description, tags, id) { this._builder.name = name; this._builder.description = description; @@ -64,9 +66,9 @@ class OperationBuilder { * @param {string} command the command to send * @returns {SendCommandOrUpdateOperation} the operation */ - send (c) { + send (command) { this._finishErr(); - return new SendCommandOrUpdateOperation(this, c); + return new SendCommandOrUpdateOperation(this, command); } /** @@ -75,13 +77,13 @@ class OperationBuilder { * @param {string} update the update to send * @returns {SendCommandOrUpdateOperation} the operation */ - postUpdate (c) { + postUpdate (update) { this._finishErr(); - return new SendCommandOrUpdateOperation(this, c, false); + return new SendCommandOrUpdateOperation(this, update, false); } /** - * Specifies the a command 'ON' should be sent as a result of this rule firing. + * Specifies the command 'ON' should be sent as a result of this rule firing. * * @returns {SendCommandOrUpdateOperation} the operation */ @@ -91,7 +93,7 @@ class OperationBuilder { } /** - * Specifies the a command 'OFF' should be sent as a result of this rule firing. + * Specifies the command 'OFF' should be sent as a result of this rule firing. * * @returns {SendCommandOrUpdateOperation} the operation */ @@ -307,6 +309,7 @@ class CopyStateOperation extends OperationConfig { class SendCommandOrUpdateOperation extends OperationConfig { constructor (operationBuilder, dataOrSupplier, isCommand = true, optionalDesc) { super(operationBuilder); + /** @private */ this.isCommand = isCommand; if (typeof dataOrSupplier === 'function') { this.dataFn = dataOrSupplier; @@ -349,6 +352,7 @@ class SendCommandOrUpdateOperation extends OperationConfig { return this; } + /** @private */ _run (args) { for (const toItemName of this.toItemNames) { const item = items.getItem(toItemName); @@ -363,10 +367,12 @@ class SendCommandOrUpdateOperation extends OperationConfig { this.next && this.next.execute(args); } + /** @private */ _complete () { return (typeof this.toItemNames) !== 'undefined'; } + /** @private */ describe (compact) { if (compact) { return this.dataDesc + (this.isCommand ? '⌘' : '↻') + this.toItemNames + (this.next ? this.next.describe() : ''); @@ -386,6 +392,7 @@ class SendCommandOrUpdateOperation extends OperationConfig { class ToggleOperation extends OperationConfig { constructor (operationBuilder) { super(operationBuilder); + /** @private */ this.next = null; /** @type {function} */ this.toItem = function (itemName) { @@ -397,8 +404,11 @@ class ToggleOperation extends OperationConfig { this.next = next; return this; }; + /** @private */ this._run = () => this.doToggle() && (this.next && this.next.execute()); + /** @private */ this._complete = () => true; + /** @private */ this.describe = () => `toggle ${this.itemName}` + (this.next ? ` and ${this.next.describe()}` : ''); } @@ -426,13 +436,18 @@ class TimingItemStateOperation extends OperationConfig { throw Error('Must specify item state value to wait for!'); } + /** @private */ this.item_changed_trigger_config = itemChangedTriggerConfig; + /** @private */ this.duration_ms = (typeof duration === 'number' ? duration : parseDuration.parse(duration)); + /** @private */ this._complete = itemChangedTriggerConfig._complete; + /** @private */ this.describe = () => itemChangedTriggerConfig.describe() + ' for ' + duration; } + /** @private */ _toOHTriggers () { // each time we're triggered, set a callback. // If the item changes to something else, cancel the callback. @@ -447,6 +462,7 @@ class TimingItemStateOperation extends OperationConfig { } } + /** @private */ _executeHook (next) { if (items.get(this.item_changed_trigger_config.item_name).toString() === this.item_changed_trigger_config.to_value) { this._startWait(next); @@ -455,6 +471,7 @@ class TimingItemStateOperation extends OperationConfig { } } + /** @private */ _startWait (next) { this.current_wait = setTimeout(next, this.duration_ms); } diff --git a/rules/rule-builder.js b/rules/rule-builder.js index affc80624..c88e48056 100644 --- a/rules/rule-builder.js +++ b/rules/rule-builder.js @@ -11,6 +11,7 @@ class RuleBuilder { constructor (toggleable) { /** @private */ this._triggerConfs = []; + /** @private */ this.toggleable = toggleable || false; } @@ -23,6 +24,7 @@ class RuleBuilder { return new triggers.TriggerBuilder(this); } + /** @private */ addTrigger (triggerConf) { if (!triggerConf._complete()) { throw Error('Trigger is not complete!'); @@ -31,15 +33,18 @@ class RuleBuilder { return this; } + /** @private */ setCondition (condition) { if (typeof condition === 'function') { condition = new conditions.FunctionConditionConf(condition); } + /** @private */ this.condition = condition; return this; } + /** @private */ setOperation (operation, optionalRuleGroup) { if (typeof operation === 'function') { const operationFunction = operation; @@ -55,7 +60,9 @@ class RuleBuilder { } } + /** @private */ this.operation = operation; + /** @private */ this.optionalRuleGroup = optionalRuleGroup; const generatedTriggers = this._triggerConfs.flatMap(x => x._toOHTriggers()); @@ -108,7 +115,7 @@ class RuleBuilder { module.exports = { RuleBuilder, /** - * Create a new {RuleBuilder} chain for easily creating rules. + * Create a new {@link RuleBuilder} chain for easily creating rules. * * @example Basic rule * rules.when().item("F1_Light").changed().then().send("changed").toItem("F2_Light").build("My Rule", "My First Rule"); diff --git a/rules/trigger-builder.js b/rules/trigger-builder.js index 8cc654ee5..beffeb70b 100644 --- a/rules/trigger-builder.js +++ b/rules/trigger-builder.js @@ -13,85 +13,109 @@ class TriggerBuilder { this._builder = builder; } + /** @private */ _setTrigger (trigger) { - this.currentTigger = trigger; - return this.currentTigger; + this.currentTrigger = trigger; + return this.currentTrigger; } + /** @private */ _or () { - this._builder.addTrigger(this.currentTigger); + this._builder.addTrigger(this.currentTrigger); return this; } + /** @private */ _then (fn) { this._or(); return new operations.OperationBuilder(this._builder, fn); } + /** @private */ _if (fn) { this._or(); return new conditions.ConditionBuilder(this._builder, fn); } /** - * Specifies a channel event as a source for the rule to fire. - * - * @param {string} channelName the name of the channel - * @returns {ChannelTriggerConfig} the trigger config - */ - channel (s) { - return this._setTrigger(new ChannelTriggerConfig(s, this)); + * Specifies a channel event as a source for the rule to fire. + * + * @param {string} channelName the name of the channel + * @returns {ChannelTriggerConfig} the trigger config + */ + channel (channelName) { + return this._setTrigger(new ChannelTriggerConfig(channelName, this)); } /** - * Specifies a cron schedule for the rule to fire. - * - * @param {string} cronExpression the cron expression - * @returns {CronTriggerConfig} the trigger config - */ - cron (s) { - return this._setTrigger(new CronTriggerConfig(s, this)); + * Specifies a cron schedule for the rule to fire. + * + * @param {string} cronExpression the cron expression + * @returns {CronTriggerConfig} the trigger config + */ + cron (cronExpression) { + return this._setTrigger(new CronTriggerConfig(cronExpression, this)); } /** - * Specifies an item as the source of changes to trigger a rule. - * - * @param {string} itemName the name of the item - * @returns {ItemTriggerConfig} the trigger config - */ - item (s) { - return this._setTrigger(new ItemTriggerConfig(s, false, this)); + * Specifies a time schedule for the rule to fire. + * + * @param {string} time the time expression (in `HH:mm`) defining the triggering schedule + * @returns {TimeOfDayTriggerConfig} the trigger config + */ + timeOfDay (time) { + return this._setTrigger(new TimeOfDayTriggerConfig(time, this)); } /** - * Specifies a group member as the source of changes to trigger a rule. - * - * @param {string} groupName the name of the group - * @returns {ItemTriggerConfig} the trigger config - */ - memberOf (s) { - return this._setTrigger(new ItemTriggerConfig(s, true, this)); + * Specifies an Item as the source of changes to trigger a rule. + * + * @param {string} itemName the name of the Item + * @returns {ItemTriggerConfig} the trigger config + */ + item (itemName) { + return this._setTrigger(new ItemTriggerConfig(itemName, false, this)); } /** - * Specifies a Thing status event as a source for the rule to fire. - * - * @param {string} thingUID the UID of the Thing - * @returns {ThingTriggerConfig} the trigger config - */ - thing (s) { - return this._setTrigger(new ThingTriggerConfig(s, this)); + * Specifies a group member as the source of changes to trigger a rule. + * + * @param {string} groupName the name of the group + * @returns {ItemTriggerConfig} the trigger config + */ + memberOf (groupName) { + return this._setTrigger(new ItemTriggerConfig(groupName, true, this)); } /** - * Specifies a system event as a source for the rule to fire. - * - * @memberof TriggerBuilder - * @returns {SystemTriggerConfig} the trigger config - */ + * Specifies a Thing status event as a source for the rule to fire. + * + * @param {string} thingUID the UID of the Thing + * @returns {ThingTriggerConfig} the trigger config + */ + thing (thingUID) { + return this._setTrigger(new ThingTriggerConfig(thingUID, this)); + } + + /** + * Specifies a system event as a source for the rule to fire. + * + * @memberof TriggerBuilder + * @returns {SystemTriggerConfig} the trigger config + */ system () { return this._setTrigger(new SystemTriggerConfig(this)); } + + /** + * Specifies a DateTime Item whose (optional) date and time schedule the rule to fire. + * + * @param {string} itemName the name of the Item to monitor for change + * @returns {DateTimeTriggerConfig} the trigger config + */ + dateTime (itemName) { + return this._setTrigger(new DateTimeTriggerConfig(itemName, this)); + } } /** @@ -100,34 +124,35 @@ class TriggerBuilder { */ class TriggerConf { constructor (triggerBuilder) { + /** @private */ this.triggerBuilder = triggerBuilder; } /** - * Add an additional Trigger - * - * @returns {TriggerBuilder} - */ + * Add an additional Trigger + * + * @returns {TriggerBuilder} + */ or () { return this.triggerBuilder._or(); } /** - * Move to the rule operations - * - * @param {*} function the optional function to execute - * @returns {operations.OperationBuilder} - */ + * Move to the rule operations + * + * @param {*} fn the optional function to execute + * @returns {operations.OperationBuilder} + */ then (fn) { return this.triggerBuilder._then(fn); } /** - * Move to the rule condition - * - * @param {*} function the optional function to execute - * @returns {conditions.ConditionBuilder} - */ + * Move to the rule condition + * + * @param {*} fn the optional function to execute + * @returns {conditions.ConditionBuilder} + */ if (fn) { return this.triggerBuilder._if(fn); } @@ -145,6 +170,7 @@ class ChannelTriggerConfig extends TriggerConf { this._toOHTriggers = () => [triggers.ChannelEventTrigger(this.channelName, this.eventName)]; } + /** @private */ describe (compact) { if (compact) { return this.channelName + (this.eventName ? `:${this.eventName}` : ''); @@ -154,26 +180,27 @@ class ChannelTriggerConfig extends TriggerConf { } /** - * trigger a specific event name - * - * @param {string} eventName - * @returns {ChannelTriggerConfig} - */ + * trigger a specific event name + * + * @param {string} eventName + * @returns {ChannelTriggerConfig} + */ to (eventName) { return this.triggered(eventName); } /** - * trigger a specific event name - * - * @param {string} eventName - * @returns {ChannelTriggerConfig} - */ + * trigger a specific event name + * + * @param {string} eventName + * @returns {ChannelTriggerConfig} + */ triggered (eventName) { this.eventName = eventName || ''; return this; } + /** @private */ _complete () { return typeof (this.eventName) !== 'undefined'; } @@ -189,15 +216,40 @@ class ChannelTriggerConfig extends TriggerConf { class CronTriggerConfig extends TriggerConf { constructor (timeStr, triggerBuilder) { super(triggerBuilder); + /** @private */ this.timeStr = timeStr; + /** @private */ this._complete = () => true; + /** @private */ this._toOHTriggers = () => [triggers.GenericCronTrigger(this.timeStr)]; + /** @private */ this.describe = (compact) => compact ? `cron_${this.timeStr}` : `matches cron "${this.timeStr}"`; } } /** - * item based trigger + * Time of day based trigger + * + * @memberof TriggerBuilder + * @extends TriggerConf + * @hideconstructor + */ +class TimeOfDayTriggerConfig extends TriggerConf { + constructor (timeStr, triggerBuilder) { + super(triggerBuilder); + /** @private */ + this.timeStr = timeStr; + /** @private */ + this._complete = () => true; + /** @private */ + this._toOHTriggers = () => [triggers.TimeOfDayTrigger(this.timeStr)]; + /** @private */ + this.describe = (compact) => compact ? `timeOfDay_${this.timeStr}` : `matches time of day "${this.timeStr}"`; + } +} + +/** + * Item based trigger * * @memberof TriggerBuilder * @extends TriggerConf @@ -206,32 +258,34 @@ class CronTriggerConfig extends TriggerConf { class ItemTriggerConfig extends TriggerConf { constructor (itemOrName, isGroup, triggerBuilder) { super(triggerBuilder); - this.type = isGroup ? 'memberOf' : 'item'; + this.type = isGroup ? 'memberOf' : 'Item'; if (typeof itemOrName !== 'string') { itemOrName = itemOrName.name; } + /** @private */ this.item_name = itemOrName; + /** @private */ this.describe = () => `${this.type} ${this.item_name} changed`; this.of = this.to; // receivedCommand().of(..) } /** - * Item to - * - * @param {*} value this item should be triggered to - * @returns {ItemTriggerConfig} - */ + * Item to + * + * @param {*} value this Item should be triggered to + * @returns {ItemTriggerConfig} + */ to (value) { this.to_value = value; return this; } /** - * Item from - * @param {*} value this items should be triggered from - * @returns {ItemTriggerConfig} - */ + * Item from + * @param {*} value this items should be triggered from + * @returns {ItemTriggerConfig} + */ from (value) { if (this.op_type !== 'changed') { throw Error('.from(..) only available for .changed()'); @@ -241,66 +295,68 @@ class ItemTriggerConfig extends TriggerConf { } /** - * item changed to OFF - * - * @returns {ItemTriggerConfig} - */ + * Item changed to OFF + * + * @returns {ItemTriggerConfig} + */ toOff () { return this.to('OFF'); } /** - * item changed to ON - * - * @returns {ItemTriggerConfig} - */ + * Item changed to ON + * + * @returns {ItemTriggerConfig} + */ toOn () { return this.to('ON'); } /** - * item recieved command - * - * @returns {ItemTriggerConfig} - */ + * Item received command + * + * @returns {ItemTriggerConfig} + */ receivedCommand () { this.op_type = 'receivedCommand'; return this; } /** - * item recieved update - * - * @returns {ItemTriggerConfig} - */ + * Item received update + * + * @returns {ItemTriggerConfig} + */ receivedUpdate () { this.op_type = 'receivedUpdate'; return this; } /** - * item changed state - * - * @returns {ItemTriggerConfig} - */ + * Item changed state + * + * @returns {ItemTriggerConfig} + */ changed () { this.op_type = 'changed'; return this; } /** - * For timespan - * @param {*} timespan - * @returns {ItemTriggerConfig} - */ + * For timespan + * @param {*} timespan + * @returns {ItemTriggerConfig} + */ for (timespan) { return new operations.TimingItemStateOperation(this, timespan); } + /** @private */ _complete () { return typeof (this.op_type) !== 'undefined'; } + /** @private */ describe (compact) { switch (this.op_type) { case 'changed': @@ -332,6 +388,7 @@ class ItemTriggerConfig extends TriggerConf { } } + /** @private */ _toOHTriggers () { if (this.type === 'memberOf') { switch (this.op_type) { @@ -358,6 +415,7 @@ class ItemTriggerConfig extends TriggerConf { } } + /** @private */ _executeHook () { const getReceivedCommand = (args) => args.receivedCommand; @@ -385,13 +443,16 @@ class ItemTriggerConfig extends TriggerConf { class ThingTriggerConfig extends TriggerConf { constructor (thingUID, triggerBuilder) { super(triggerBuilder); + /** @private */ this.thingUID = thingUID; } + /** @private */ _complete () { return typeof (this.op_type) !== 'undefined'; } + /** @private */ describe (compact) { switch (this.op_type) { case 'changed': @@ -414,30 +475,30 @@ class ThingTriggerConfig extends TriggerConf { } /** - * thing changed - * - * @returns {ThingTriggerConfig} - */ + * thing changed + * + * @returns {ThingTriggerConfig} + */ changed () { this.op_type = 'changed'; return this; } /** - * thing updates - * - * @returns {ThingTriggerConfig} - */ + * thing updates + * + * @returns {ThingTriggerConfig} + */ updated () { this.op_type = 'updated'; return this; } /** - * thing status changed from - * - * @returns {ThingTriggerConfig} - */ + * thing status changed from + * + * @returns {ThingTriggerConfig} + */ from (value) { if (this.op_type !== 'changed') { throw Error('.from(..) only available for .changed()'); @@ -447,15 +508,16 @@ class ThingTriggerConfig extends TriggerConf { } /** - * thing status changed to - * - * @returns {ThingTriggerConfig} - */ + * thing status changed to + * + * @returns {ThingTriggerConfig} + */ to (value) { this.to_value = value; return this; } + /** @private */ _toOHTriggers () { switch (this.op_type) { case 'changed': @@ -482,60 +544,62 @@ class SystemTriggerConfig extends TriggerConf { this.describe = (compact) => compact ? `system:${this.level}` : `system level "${this.level}"`; } + /** @private */ _complete () { return typeof (this.level) !== 'undefined'; } /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ rulesLoaded () { return this.startLevel(40); } /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ ruleEngineStarted () { return this.startLevel(50); } /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ userInterfacesStarted () { return this.startLevel(70); } /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ thingsInitialized () { return this.startLevel(80); } /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ startupComplete () { return this.startLevel(100); } /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @param {number} level + * @returns {SystemTriggerConfig} + */ startLevel (level) { if (typeof (this.level) !== 'undefined') { throw Error('Level already set'); @@ -545,6 +609,40 @@ class SystemTriggerConfig extends TriggerConf { } } +/** + * DateTime Item based trigger + * + * @memberof TriggerBuilder + * @extends TriggerConf + * @hideconstructor + */ +class DateTimeTriggerConfig extends TriggerConf { + constructor (itemName, triggerBuilder) { + super(triggerBuilder); + /** @private */ + this._itemName = itemName; + /** @private */ + this._timeOnly = false; + /** @private */ + this._complete = () => true; + /** @private */ + this._toOHTriggers = () => [triggers.DateTimeTrigger(this._itemName, this._timeOnly)]; + /** @private */ + this.describe = (compact) => compact ? `dateTime_${this._itemName}` : `matches ${this._timeOnly ? 'time' : 'date and time'} of Item "${this._itemName}"`; + } + + /** + * Specifies whether only the time of the Item should be compared or the date and time. + * + * @param {boolean} [timeOnly=true] + * @returns {DateTimeTriggerConfig} + */ + timeOnly (timeOnly = true) { + this._timeOnly = timeOnly; + return this; + } +} + module.exports = { CronTriggerConfig, ChannelTriggerConfig, diff --git a/triggers.js b/triggers.js index 8d35e65f7..60d378ee2 100644 --- a/triggers.js +++ b/triggers.js @@ -8,6 +8,8 @@ */ const utils = require('./utils'); +const log = require('./log')('triggers'); + /** * @type {Item} * @private @@ -31,6 +33,8 @@ function _createTrigger (typeString, name, config) { name = utils.randomUUID().toString(); } + log.debug('Creating {} trigger as {} with config: {}', typeString, name, JSON.stringify(config || {})); + return ModuleBuilder.createTrigger() .withId(name) .withTypeUID(typeString) @@ -244,7 +248,7 @@ const GenericCronTrigger = (expression, triggerName) => * TimeOfDayTrigger('19:00'); * * @memberof triggers - * @param {string} time the time expression defining the triggering schedule + * @param {string} time the time expression (in `HH:mm`) defining the triggering schedule * @param {string} [triggerName] the optional name of the trigger to create */ const TimeOfDayTrigger = (time, triggerName) => diff --git a/types/rules/condition-builder.d.ts b/types/rules/condition-builder.d.ts index 107ed8119..b71388482 100644 --- a/types/rules/condition-builder.d.ts +++ b/types/rules/condition-builder.d.ts @@ -12,7 +12,8 @@ export class FunctionConditionConf { * @param {*} fn callback which determines whether the condition passes */ constructor(fn: any, conditionBuilder: any); - fn: any; + /** @private */ + private fn; /** * Checks whether the rule operations should be run * @@ -31,9 +32,10 @@ export class FunctionConditionConf { */ export class ItemStateConditionConf { constructor(itemName: any, conditionBuilder: any); - item_name: any; + /** @private */ + private item_name; /** - * Checks if item state is equal to vlaue + * Checks if item state is equal to value * @param {*} value * @returns {this} */ @@ -58,11 +60,12 @@ export class ConditionBuilder { private _builder; /** @private */ private _fn; - _then(condition: any, fn: any): operations.OperationBuilder; + /** @private */ + private _then; /** * Move to the rule operations * - * @param {*} function the optional function to execute + * @param {*} fn the optional function to execute * @returns {operations.OperationBuilder} */ then(fn: any): operations.OperationBuilder; diff --git a/types/rules/condition-builder.d.ts.map b/types/rules/condition-builder.d.ts.map index d11fac58b..2041edc57 100644 --- a/types/rules/condition-builder.d.ts.map +++ b/types/rules/condition-builder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"condition-builder.d.ts","sourceRoot":"","sources":["../../rules/condition-builder.js"],"names":[],"mappings":"AAoEA;;;;;;GAMG;AACH;IACE;;;;SAIK;IACL,4CAGC;IADC,QAAY;IAGd;;;;;;SAMK;IACL,cAGC;CACF;AAED;;;;;;GAMG;AACH;IACE,kDAGC;IADC,eAAyB;IAG3B;;;;SAIK;IACL,gBAFe,IAAI,CAKlB;IAFC,cAAqB;IAIvB;;;;SAIK;IACL,cAHiB,GAAG,KACL,IAAI,CAKlB;IAED,+BAMC;CACF;AAxID;;;;GAIG;AACH;IACE,mCAKC;IAJC,eAAe;IACf,iBAAuB;IACvB,eAAe;IACf,YAAa;IAGf,4DAGC;IAED;;;;;OAKG;IACH,eAFa,WAAW,gBAAgB,CASvC;IAED;;;;;;QAMI;IACJ,sBAHY,MAAM,GACJ,sBAAsB,CAKnC;IAFC,kCAA2D;CAG9D"} \ No newline at end of file +{"version":3,"file":"condition-builder.d.ts","sourceRoot":"","sources":["../../rules/condition-builder.js"],"names":[],"mappings":"AAsEA;;;;;;GAMG;AACH;IACE;;;;SAIK;IACL,4CAIC;IAFC,eAAe;IACf,WAAY;IAGd;;;;;;SAMK;IACL,cAEC;CACF;AAED;;;;;;GAMG;AACH;IACE,kDAIC;IAFC,eAAe;IACf,kBAAyB;IAG3B;;;;SAIK;IACL,gBAFe,IAAI,CAKlB;IAFC,cAAqB;IAIvB;;;;SAIK;IACL,cAHiB,GAAG,KACL,IAAI,CAKlB;IAED,+BAMC;CACF;AA3ID;;;;GAIG;AACH;IACE,mCAKC;IAJC,eAAe;IACf,iBAAuB;IACvB,eAAe;IACf,YAAa;IAGf,eAAe;IACf,cAGC;IAED;;;;;OAKG;IACH,eAFa,WAAW,gBAAgB,CASvC;IAED;;;;;;QAMI;IACJ,sBAHY,MAAM,GACJ,sBAAsB,CAKnC;IAFC,kCAA2D;CAG9D"} \ No newline at end of file diff --git a/types/rules/operation-builder.d.ts b/types/rules/operation-builder.d.ts index 7c4741fdd..8825c3b20 100644 --- a/types/rules/operation-builder.d.ts +++ b/types/rules/operation-builder.d.ts @@ -8,7 +8,8 @@ export type Item = import("../items/items").Item; */ export class SendCommandOrUpdateOperation extends OperationConfig { constructor(operationBuilder: any, dataOrSupplier: any, isCommand: boolean, optionalDesc: any); - isCommand: boolean; + /** @private */ + private isCommand; dataFn: any; dataDesc: any; /** @@ -33,9 +34,12 @@ export class SendCommandOrUpdateOperation extends OperationConfig { */ and(next: any): SendCommandOrUpdateOperation; next: any; - _run(args: any): void; - _complete(): boolean; - describe(compact: any): string; + /** @private */ + private _run; + /** @private */ + private _complete; + /** @private */ + private describe; } /** * Timing Item state @@ -46,13 +50,20 @@ export class SendCommandOrUpdateOperation extends OperationConfig { */ export class TimingItemStateOperation extends OperationConfig { constructor(operationBuilder: any, itemChangedTriggerConfig: any, duration: any); - item_changed_trigger_config: any; - duration_ms: any; - _complete: any; - describe: () => string; - _toOHTriggers(): any[]; - _executeHook(next: any): void; - _startWait(next: any): void; + /** @private */ + private item_changed_trigger_config; + /** @private */ + private duration_ms; + /** @private */ + private _complete; + /** @private */ + private describe; + /** @private */ + private _toOHTriggers; + /** @private */ + private _executeHook; + /** @private */ + private _startWait; current_wait: NodeJS.Timeout; _cancelWait(): void; } @@ -64,14 +75,18 @@ export class TimingItemStateOperation extends OperationConfig { * @hideconstructor */ export class ToggleOperation extends OperationConfig { - next: any; + /** @private */ + private next; /** @type {function} */ toItem: Function; /** @type {function} */ and: Function; - _run: () => any; - _complete: () => boolean; - describe: () => string; + /** @private */ + private _run; + /** @private */ + private _complete; + /** @private */ + private describe; /** * Toggle the state of an item * @@ -153,8 +168,10 @@ export class OperationBuilder { private _builder; /** @private */ private _fn; - _finishErr(): void; - _then(operation: any, group: any, name: any, description: any, tags: any, id: any): void; + /** @private */ + private _finishErr; + /** @private */ + private _then; /** * Build this rule * @@ -178,22 +195,22 @@ export class OperationBuilder { * @param {string} command the command to send * @returns {SendCommandOrUpdateOperation} the operation */ - send(c: any): SendCommandOrUpdateOperation; + send(command: string): SendCommandOrUpdateOperation; /** * Specifies that an update should be posted as a result of this rule firing. * * @param {string} update the update to send * @returns {SendCommandOrUpdateOperation} the operation */ - postUpdate(c: any): SendCommandOrUpdateOperation; + postUpdate(update: string): SendCommandOrUpdateOperation; /** - * Specifies the a command 'ON' should be sent as a result of this rule firing. + * Specifies the command 'ON' should be sent as a result of this rule firing. * * @returns {SendCommandOrUpdateOperation} the operation */ sendOn(): SendCommandOrUpdateOperation; /** - * Specifies the a command 'OFF' should be sent as a result of this rule firing. + * Specifies the command 'OFF' should be sent as a result of this rule firing. * * @returns {SendCommandOrUpdateOperation} the operation */ diff --git a/types/rules/operation-builder.d.ts.map b/types/rules/operation-builder.d.ts.map index d0dae6ba6..c80245879 100644 --- a/types/rules/operation-builder.d.ts.map +++ b/types/rules/operation-builder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"operation-builder.d.ts","sourceRoot":"","sources":["../../rules/operation-builder.js"],"names":[],"mappings":"mBAIc,OAAO,gBAAgB,EAAE,IAAI;AAuS3C;;;;;;GAMG;AACH;IACE,+FAUC;IARC,mBAA0B;IAExB,YAA4B;IAC5B,cAA6C;IAOjD;;;;;SAKK;IACL,sBAHa,IAAI,EAAE,GAAG,MAAM,EAAE,GACf,4BAA4B,CAK1C;IAFC,mBAA8E;IAIhF;;;;;SAKK;IACL,mBAHa,IAAI,GAAG,MAAM,GACX,4BAA4B,CAK1C;IAED;;;;SAIK;IACL,gBAFe,4BAA4B,CAK1C;IAFC,UAAgB;IAIlB,sBAYC;IAED,qBAEC;IAED,+BAMC;CACF;AAsCD;;;;;;GAMG;AACH;IACE,iFAWC;IALC,iCAA2D;IAC3D,iBAA4F;IAE5F,eAAmD;IACnD,uBAA8E;IAGhF,uBAYC;IAED,8BAMC;IAED,4BAEC;IADC,6BAAsD;IAGxD,oBAIC;CACF;AAxFD;;;;;;GAMG;AACH;IAGI,UAAgB;IAChB,uBAAuB;IACvB,iBAGC;IACD,uBAAuB;IACvB,cAGC;IACD,gBAAuE;IACvE,yBAA2B;IAC3B,uBAAmG;IAGrG;;;;SAIK;IACL,YAFe,4BAA4B,CAI1C;CACF;AA5ND;;;;;;GAMG;AACH;IACE;;;;;SAKK;IACL,yCAHa,OAAO,EAMnB;IADC,cAAgB;IAGlB;;;;;SAKK;IACL,mBAHa,MAAM,GACJ,kBAAkB,CAKhC;IAFC,kBAAyB;IAI3B;;;;;SAKK;IACL,iBAHa,MAAM,GACJ,kBAAkB,CAKhC;IAFC,gBAAuB;IAIzB;;;SAGK;IACL,OAFe,kBAAkB,CAMhC;IAFC,uBAAgB;IAIlB;;;;;SAKK;IACL,aA2BC;IAED;;;;;SAKK;IACL,kBAEC;IAED;;;;;SAKK;IACL,iBAEC;CACF;AAtSD;;;GAGG;AAEH;;;GAGG;AACH;IACE,mCAKC;IAJC,eAAe;IACf,iBAAuB;IACvB,eAAe;IACf,YAAa;IAGf,mBAIC;IAED,yFAMC;IAED;;;;;;;SAOK;IACL,aALa,MAAM,gBACN,MAAM,SACN,aAAa,OACb,MAAM,QAOlB;IAED;;;;;SAKK;IACL,eAHa,MAAM,GACJ,gBAAgB,CAK9B;IAFC,cAAkB;IAIpB;;;;;QAKI;IACJ,cAFc,4BAA4B,CAKzC;IAED;;;;;SAKK;IACL,oBAFe,4BAA4B,CAK1C;IAED;;;;SAIK;IACL,UAFe,4BAA4B,CAK1C;IAED;;;;SAIK;IACL,WAFe,4BAA4B,CAK1C;IAED;;;;;SAKK;IACL,cAFe,eAAe,CAK7B;IAED;;;;;;SAMK;IACL,UAFe,4BAA4B,CAK1C;IAED;;;;;;SAMK;IACL,UAFe,4BAA4B,CAK1C;IAED;;;;;SAKK;IACL,aAFe,kBAAkB,CAKhC;IAED;;;;;SAKK;IACL,oBAFe,kBAAkB,CAKhC;CACF;AAED;;;GAGG;AACH;IACE,mCAEC;IADC,sBAAwC;IAG1C;;;;;SAKK;IACL,eAHa,MAAM,GACJ,gBAAgB,CAK9B;IAFC,cAAkB;IAIpB;;;;;;;SAOK;IACL,aALa,MAAM,gBACN,MAAM,SACN,aAAa,OACb,MAAM,QAIlB;CACF"} \ No newline at end of file +{"version":3,"file":"operation-builder.d.ts","sourceRoot":"","sources":["../../rules/operation-builder.js"],"names":[],"mappings":"mBAIc,OAAO,gBAAgB,EAAE,IAAI;AAyS3C;;;;;;GAMG;AACH;IACE,+FAWC;IATC,eAAe;IACf,kBAA0B;IAExB,YAA4B;IAC5B,cAA6C;IAOjD;;;;;SAKK;IACL,sBAHa,IAAI,EAAE,GAAG,MAAM,EAAE,GACf,4BAA4B,CAK1C;IAFC,mBAA8E;IAIhF;;;;;SAKK;IACL,mBAHa,IAAI,GAAG,MAAM,GACX,4BAA4B,CAK1C;IAED;;;;SAIK;IACL,gBAFe,4BAA4B,CAK1C;IAFC,UAAgB;IAIlB,eAAe;IACf,aAYC;IAED,eAAe;IACf,kBAEC;IAED,eAAe;IACf,iBAMC;CACF;AA0CD;;;;;;GAMG;AACH;IACE,iFAeC;IATC,eAAe;IACf,oCAA2D;IAC3D,eAAe;IACf,oBAA4F;IAE5F,eAAe;IACf,kBAAmD;IACnD,eAAe;IACf,iBAA8E;IAGhF,eAAe;IACf,sBAYC;IAED,eAAe;IACf,qBAMC;IAED,eAAe;IACf,mBAEC;IADC,6BAAsD;IAGxD,oBAIC;CACF;AAnGD;;;;;;GAMG;AACH;IAGI,eAAe;IACf,aAAgB;IAChB,uBAAuB;IACvB,iBAGC;IACD,uBAAuB;IACvB,cAGC;IACD,eAAe;IACf,aAAuE;IACvE,eAAe;IACf,kBAA2B;IAC3B,eAAe;IACf,iBAAmG;IAGrG;;;;SAIK;IACL,YAFe,4BAA4B,CAI1C;CACF;AApOD;;;;;;GAMG;AACH;IACE;;;;;SAKK;IACL,yCAHa,OAAO,EAMnB;IADC,cAAgB;IAGlB;;;;;SAKK;IACL,mBAHa,MAAM,GACJ,kBAAkB,CAKhC;IAFC,kBAAyB;IAI3B;;;;;SAKK;IACL,iBAHa,MAAM,GACJ,kBAAkB,CAKhC;IAFC,gBAAuB;IAIzB;;;SAGK;IACL,OAFe,kBAAkB,CAMhC;IAFC,uBAAgB;IAIlB;;;;;SAKK;IACL,aA2BC;IAED;;;;;SAKK;IACL,kBAEC;IAED;;;;;SAKK;IACL,iBAEC;CACF;AAxSD;;;GAGG;AAEH;;;GAGG;AACH;IACE,mCAKC;IAJC,eAAe;IACf,iBAAuB;IACvB,eAAe;IACf,YAAa;IAGf,eAAe;IACf,mBAIC;IAED,eAAe;IACf,cAMC;IAED;;;;;;;SAOK;IACL,aALa,MAAM,gBACN,MAAM,SACN,aAAa,OACb,MAAM,QAOlB;IAED;;;;;SAKK;IACL,eAHa,MAAM,GACJ,gBAAgB,CAK9B;IAFC,cAAkB;IAIpB;;;;;QAKI;IACJ,cAHY,MAAM,GACJ,4BAA4B,CAKzC;IAED;;;;;SAKK;IACL,mBAHa,MAAM,GACJ,4BAA4B,CAK1C;IAED;;;;SAIK;IACL,UAFe,4BAA4B,CAK1C;IAED;;;;SAIK;IACL,WAFe,4BAA4B,CAK1C;IAED;;;;;SAKK;IACL,cAFe,eAAe,CAK7B;IAED;;;;;;SAMK;IACL,UAFe,4BAA4B,CAK1C;IAED;;;;;;SAMK;IACL,UAFe,4BAA4B,CAK1C;IAED;;;;;SAKK;IACL,aAFe,kBAAkB,CAKhC;IAED;;;;;SAKK;IACL,oBAFe,kBAAkB,CAKhC;CACF;AAED;;;GAGG;AACH;IACE,mCAEC;IADC,sBAAwC;IAG1C;;;;;SAKK;IACL,eAHa,MAAM,GACJ,gBAAgB,CAK9B;IAFC,cAAkB;IAIpB;;;;;;;SAOK;IACL,aALa,MAAM,gBACN,MAAM,SACN,aAAa,OACb,MAAM,QAIlB;CACF"} \ No newline at end of file diff --git a/types/rules/rule-builder.d.ts b/types/rules/rule-builder.d.ts index 5137beff3..54771b2d1 100644 --- a/types/rules/rule-builder.d.ts +++ b/types/rules/rule-builder.d.ts @@ -6,19 +6,26 @@ export class RuleBuilder { constructor(toggleable: any); /** @private */ private _triggerConfs; - toggleable: any; + /** @private */ + private toggleable; /** * Specifies when the rule should occur. Will create a standard rule. * * @returns {triggers.TriggerBuilder} rule builder */ when(): triggers.TriggerBuilder; - addTrigger(triggerConf: any): RuleBuilder; - setCondition(condition: any): RuleBuilder; - condition: any; - setOperation(operation: any, optionalRuleGroup: any): HostRule; - operation: any; - optionalRuleGroup: any; + /** @private */ + private addTrigger; + /** @private */ + private setCondition; + /** @private */ + private condition; + /** @private */ + private setOperation; + /** @private */ + private operation; + /** @private */ + private optionalRuleGroup; describe(compact: any): string; } import triggers = require("./trigger-builder"); diff --git a/types/rules/rule-builder.d.ts.map b/types/rules/rule-builder.d.ts.map index d7346ea24..1a6e83f7c 100644 --- a/types/rules/rule-builder.d.ts.map +++ b/types/rules/rule-builder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"rule-builder.d.ts","sourceRoot":"","sources":["../../rules/rule-builder.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;IACE,6BAIC;IAHC,eAAe;IACf,sBAAuB;IACvB,gBAAqC;IAGvC;;;;SAIK;IACL,QAFe,SAAS,cAAc,CAIrC;IAED,0CAMC;IAED,0CAOC;IAFC,eAA0B;IAI5B,+DAsDC;IAvCC,eAA0B;IAC1B,uBAA0C;IAwC5C,+BAMC;CACF;;AAmBO,4EAAkD"} \ No newline at end of file +{"version":3,"file":"rule-builder.d.ts","sourceRoot":"","sources":["../../rules/rule-builder.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;IACE,6BAKC;IAJC,eAAe;IACf,sBAAuB;IACvB,eAAe;IACf,mBAAqC;IAGvC;;;;SAIK;IACL,QAFe,SAAS,cAAc,CAIrC;IAED,eAAe;IACf,mBAMC;IAED,eAAe;IACf,qBAQC;IAHC,eAAe;IACf,kBAA0B;IAI5B,eAAe;IACf,qBAwDC;IAzCC,eAAe;IACf,kBAA0B;IAC1B,eAAe;IACf,0BAA0C;IAwC5C,+BAMC;CACF;;AAmBO,4EAAkD"} \ No newline at end of file diff --git a/types/rules/trigger-builder.d.ts b/types/rules/trigger-builder.d.ts index 1de56ed38..61960bde8 100644 --- a/types/rules/trigger-builder.d.ts +++ b/types/rules/trigger-builder.d.ts @@ -7,10 +7,14 @@ */ export class CronTriggerConfig extends TriggerConf { constructor(timeStr: any, triggerBuilder: any); - timeStr: any; - _complete: () => boolean; - _toOHTriggers: () => HostTrigger[]; - describe: (compact: any) => string; + /** @private */ + private timeStr; + /** @private */ + private _complete; + /** @private */ + private _toOHTriggers; + /** @private */ + private describe; } /** * @memberof TriggerBuilder @@ -21,26 +25,28 @@ export class ChannelTriggerConfig extends TriggerConf { constructor(channelName: any, triggerBuilder: any); channelName: any; _toOHTriggers: () => HostTrigger[]; - describe(compact: any): string; + /** @private */ + private describe; /** - * trigger a specific event name - * - * @param {string} eventName - * @returns {ChannelTriggerConfig} - */ + * trigger a specific event name + * + * @param {string} eventName + * @returns {ChannelTriggerConfig} + */ to(eventName: string): ChannelTriggerConfig; /** - * trigger a specific event name - * - * @param {string} eventName - * @returns {ChannelTriggerConfig} - */ + * trigger a specific event name + * + * @param {string} eventName + * @returns {ChannelTriggerConfig} + */ triggered(eventName: string): ChannelTriggerConfig; eventName: string; - _complete(): boolean; + /** @private */ + private _complete; } /** - * item based trigger + * Item based trigger * * @memberof TriggerBuilder * @extends TriggerConf @@ -49,64 +55,69 @@ export class ChannelTriggerConfig extends TriggerConf { export class ItemTriggerConfig extends TriggerConf { constructor(itemOrName: any, isGroup: any, triggerBuilder: any); type: string; - item_name: any; - describe(compact: any): string; + /** @private */ + private item_name; + /** @private */ + private describe; of: (value: any) => ItemTriggerConfig; /** - * Item to - * - * @param {*} value this item should be triggered to - * @returns {ItemTriggerConfig} - */ + * Item to + * + * @param {*} value this Item should be triggered to + * @returns {ItemTriggerConfig} + */ to(value: any): ItemTriggerConfig; to_value: any; /** - * Item from - * @param {*} value this items should be triggered from - * @returns {ItemTriggerConfig} - */ + * Item from + * @param {*} value this items should be triggered from + * @returns {ItemTriggerConfig} + */ from(value: any): ItemTriggerConfig; from_value: any; /** - * item changed to OFF - * - * @returns {ItemTriggerConfig} - */ + * Item changed to OFF + * + * @returns {ItemTriggerConfig} + */ toOff(): ItemTriggerConfig; /** - * item changed to ON - * - * @returns {ItemTriggerConfig} - */ + * Item changed to ON + * + * @returns {ItemTriggerConfig} + */ toOn(): ItemTriggerConfig; /** - * item recieved command - * - * @returns {ItemTriggerConfig} - */ + * Item received command + * + * @returns {ItemTriggerConfig} + */ receivedCommand(): ItemTriggerConfig; op_type: string; /** - * item recieved update - * - * @returns {ItemTriggerConfig} - */ + * Item received update + * + * @returns {ItemTriggerConfig} + */ receivedUpdate(): ItemTriggerConfig; /** - * item changed state - * - * @returns {ItemTriggerConfig} - */ + * Item changed state + * + * @returns {ItemTriggerConfig} + */ changed(): ItemTriggerConfig; /** - * For timespan - * @param {*} timespan - * @returns {ItemTriggerConfig} - */ + * For timespan + * @param {*} timespan + * @returns {ItemTriggerConfig} + */ for(timespan: any): ItemTriggerConfig; - _complete(): boolean; - _toOHTriggers(): HostTrigger[]; - _executeHook(): (next: any, args: any) => any; + /** @private */ + private _complete; + /** @private */ + private _toOHTriggers; + /** @private */ + private _executeHook; } /** * Thing based trigger @@ -117,37 +128,41 @@ export class ItemTriggerConfig extends TriggerConf { */ export class ThingTriggerConfig extends TriggerConf { constructor(thingUID: any, triggerBuilder: any); - thingUID: any; - _complete(): boolean; - describe(compact: any): string; - /** - * thing changed - * - * @returns {ThingTriggerConfig} - */ + /** @private */ + private thingUID; + /** @private */ + private _complete; + /** @private */ + private describe; + /** + * thing changed + * + * @returns {ThingTriggerConfig} + */ changed(): ThingTriggerConfig; op_type: string; /** - * thing updates - * - * @returns {ThingTriggerConfig} - */ + * thing updates + * + * @returns {ThingTriggerConfig} + */ updated(): ThingTriggerConfig; /** - * thing status changed from - * - * @returns {ThingTriggerConfig} - */ + * thing status changed from + * + * @returns {ThingTriggerConfig} + */ from(value: any): ThingTriggerConfig; from_value: any; /** - * thing status changed to - * - * @returns {ThingTriggerConfig} - */ + * thing status changed to + * + * @returns {ThingTriggerConfig} + */ to(value: any): ThingTriggerConfig; to_value: any; - _toOHTriggers(): HostTrigger[]; + /** @private */ + private _toOHTriggers; } /** * System based trigger @@ -159,44 +174,46 @@ export class ThingTriggerConfig extends TriggerConf { export class SystemTriggerConfig extends TriggerConf { _toOHTriggers: () => HostTrigger[]; describe: (compact: any) => string; - _complete(): boolean; + /** @private */ + private _complete; /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ rulesLoaded(): SystemTriggerConfig; /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ ruleEngineStarted(): SystemTriggerConfig; /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ userInterfacesStarted(): SystemTriggerConfig; /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ thingsInitialized(): SystemTriggerConfig; /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ + * System trigger + * + * @returns {SystemTriggerConfig} + */ startupComplete(): SystemTriggerConfig; /** - * System trigger - * - * @returns {SystemTriggerConfig} - */ - startLevel(level: any): SystemTriggerConfig; - level: any; + * System trigger + * + * @param {number} level + * @returns {SystemTriggerConfig} + */ + startLevel(level: number): SystemTriggerConfig; + level: number; } /** * Builder for rule Triggers @@ -207,53 +224,71 @@ export class TriggerBuilder { constructor(builder: any); /** @private */ private _builder; - _setTrigger(trigger: any): any; - currentTigger: any; - _or(): TriggerBuilder; - _then(fn: any): operations.OperationBuilder; - _if(fn: any): conditions.ConditionBuilder; - /** - * Specifies a channel event as a source for the rule to fire. - * - * @param {string} channelName the name of the channel - * @returns {ChannelTriggerConfig} the trigger config - */ - channel(s: any): ChannelTriggerConfig; - /** - * Specifies a cron schedule for the rule to fire. - * - * @param {string} cronExpression the cron expression - * @returns {CronTriggerConfig} the trigger config - */ - cron(s: any): CronTriggerConfig; - /** - * Specifies an item as the source of changes to trigger a rule. - * - * @param {string} itemName the name of the item - * @returns {ItemTriggerConfig} the trigger config - */ - item(s: any): ItemTriggerConfig; - /** - * Specifies a group member as the source of changes to trigger a rule. - * - * @param {string} groupName the name of the group - * @returns {ItemTriggerConfig} the trigger config - */ - memberOf(s: any): ItemTriggerConfig; - /** - * Specifies a Thing status event as a source for the rule to fire. - * - * @param {string} thingUID the UID of the Thing - * @returns {ThingTriggerConfig} the trigger config - */ - thing(s: any): ThingTriggerConfig; - /** - * Specifies a system event as a source for the rule to fire. - * - * @memberof TriggerBuilder - * @returns {SystemTriggerConfig} the trigger config - */ + /** @private */ + private _setTrigger; + currentTrigger: any; + /** @private */ + private _or; + /** @private */ + private _then; + /** @private */ + private _if; + /** + * Specifies a channel event as a source for the rule to fire. + * + * @param {string} channelName the name of the channel + * @returns {ChannelTriggerConfig} the trigger config + */ + channel(channelName: string): ChannelTriggerConfig; + /** + * Specifies a cron schedule for the rule to fire. + * + * @param {string} cronExpression the cron expression + * @returns {CronTriggerConfig} the trigger config + */ + cron(cronExpression: string): CronTriggerConfig; + /** + * Specifies a time schedule for the rule to fire. + * + * @param {string} time the time expression (in `HH:mm`) defining the triggering schedule + * @returns {TimeOfDayTriggerConfig} the trigger config + */ + timeOfDay(time: string): TimeOfDayTriggerConfig; + /** + * Specifies an Item as the source of changes to trigger a rule. + * + * @param {string} itemName the name of the Item + * @returns {ItemTriggerConfig} the trigger config + */ + item(itemName: string): ItemTriggerConfig; + /** + * Specifies a group member as the source of changes to trigger a rule. + * + * @param {string} groupName the name of the group + * @returns {ItemTriggerConfig} the trigger config + */ + memberOf(groupName: string): ItemTriggerConfig; + /** + * Specifies a Thing status event as a source for the rule to fire. + * + * @param {string} thingUID the UID of the Thing + * @returns {ThingTriggerConfig} the trigger config + */ + thing(thingUID: string): ThingTriggerConfig; + /** + * Specifies a system event as a source for the rule to fire. + * + * @memberof TriggerBuilder + * @returns {SystemTriggerConfig} the trigger config + */ system(): SystemTriggerConfig; + /** + * Specifies a DateTime Item whose (optional) date and time schedule the rule to fire. + * + * @param {string} itemName the name of the Item to monitor for change + * @returns {DateTimeTriggerConfig} the trigger config + */ + dateTime(itemName: string): DateTimeTriggerConfig; } /** * {RuleBuilder} RuleBuilder triggers @@ -261,28 +296,74 @@ export class TriggerBuilder { */ declare class TriggerConf { constructor(triggerBuilder: any); - triggerBuilder: any; + /** @private */ + private triggerBuilder; /** - * Add an additional Trigger - * - * @returns {TriggerBuilder} - */ + * Add an additional Trigger + * + * @returns {TriggerBuilder} + */ or(): TriggerBuilder; /** - * Move to the rule operations - * - * @param {*} function the optional function to execute - * @returns {operations.OperationBuilder} - */ + * Move to the rule operations + * + * @param {*} fn the optional function to execute + * @returns {operations.OperationBuilder} + */ then(fn: any): operations.OperationBuilder; /** - * Move to the rule condition - * - * @param {*} function the optional function to execute - * @returns {conditions.ConditionBuilder} - */ + * Move to the rule condition + * + * @param {*} fn the optional function to execute + * @returns {conditions.ConditionBuilder} + */ if(fn: any): conditions.ConditionBuilder; } +/** + * Time of day based trigger + * + * @memberof TriggerBuilder + * @extends TriggerConf + * @hideconstructor + */ +declare class TimeOfDayTriggerConfig extends TriggerConf { + constructor(timeStr: any, triggerBuilder: any); + /** @private */ + private timeStr; + /** @private */ + private _complete; + /** @private */ + private _toOHTriggers; + /** @private */ + private describe; +} +/** + * DateTime Item based trigger + * + * @memberof TriggerBuilder + * @extends TriggerConf + * @hideconstructor + */ +declare class DateTimeTriggerConfig extends TriggerConf { + constructor(itemName: any, triggerBuilder: any); + /** @private */ + private _itemName; + /** @private */ + private _timeOnly; + /** @private */ + private _complete; + /** @private */ + private _toOHTriggers; + /** @private */ + private describe; + /** + * Specifies whether only the time of the Item should be compared or the date and time. + * + * @param {boolean} [timeOnly=true] + * @returns {DateTimeTriggerConfig} + */ + timeOnly(timeOnly?: boolean): DateTimeTriggerConfig; +} import operations = require("./operation-builder"); import conditions = require("./condition-builder"); export {}; diff --git a/types/rules/trigger-builder.d.ts.map b/types/rules/trigger-builder.d.ts.map index 06ee9ac18..719274dc2 100644 --- a/types/rules/trigger-builder.d.ts.map +++ b/types/rules/trigger-builder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"trigger-builder.d.ts","sourceRoot":"","sources":["../../rules/trigger-builder.js"],"names":[],"mappings":"AAqLA;;;;;;GAMG;AACH;IACE,+CAMC;IAJC,aAAsB;IACtB,yBAA2B;IAC3B,mCAAsE;IACtE,mCAAgG;CAEnG;AA7DD;;;;GAIG;AACH;IACE,mDAIC;IAFC,iBAA8B;IAC9B,mCAA2F;IAG7F,+BAMC;IAED;;;;;SAKK;IACL,cAHa,MAAM,GACJ,oBAAoB,CAIlC;IAED;;;;;SAKK;IACL,qBAHa,MAAM,GACJ,oBAAoB,CAKlC;IAFC,kBAAgC;IAIlC,qBAEC;CACF;AAmBD;;;;;;GAMG;AACH;IACE,gEAUC;IARC,aAAyC;IAKzC,eAA2B;IA0F7B,+BA6BC;IArHC,oBAOa,iBAAiB,CAPb;IAGnB;;;;;SAKK;IACL,gBAFe,iBAAiB,CAK/B;IAFC,cAAqB;IAIvB;;;;SAIK;IACL,kBAFe,iBAAiB,CAQ/B;IAFC,gBAAuB;IAIzB;;;;SAIK;IACL,SAFe,iBAAiB,CAI/B;IAED;;;;SAIK;IACL,QAFe,iBAAiB,CAI/B;IAED;;;;SAIK;IACL,mBAFe,iBAAiB,CAK/B;IAFC,gBAAgC;IAIlC;;;;SAIK;IACL,kBAFe,iBAAiB,CAK/B;IAED;;;;SAIK;IACL,WAFe,iBAAiB,CAK/B;IAED;;;;SAIK;IACL,oBAFe,iBAAiB,CAI/B;IAED,qBAEC;IAiCD,+BAwBC;IAED,8CAcC;CACF;AAED;;;;;;GAMG;AACH;IACE,gDAGC;IADC,cAAwB;IAG1B,qBAEC;IAED,+BAmBC;IAED;;;;SAIK;IACL,WAFe,kBAAkB,CAKhC;IAFC,gBAAwB;IAI1B;;;;SAIK;IACL,WAFe,kBAAkB,CAKhC;IAED;;;;SAIK;IACL,kBAFe,kBAAkB,CAQhC;IAFC,gBAAuB;IAIzB;;;;SAIK;IACL,gBAFe,kBAAkB,CAKhC;IAFC,cAAqB;IAIvB,+BASC;CACF;AAED;;;;;;GAMG;AACH;IAGI,mCAAyE;IACzE,mCAA8F;IAGhG,qBAEC;IAED;;;;SAIK;IACL,eAFe,mBAAmB,CAIjC;IAED;;;;SAIK;IACL,qBAFe,mBAAmB,CAIjC;IAED;;;;SAIK;IACL,yBAFe,mBAAmB,CAIjC;IAED;;;;SAIK;IACL,qBAFe,mBAAmB,CAIjC;IAED;;;;SAIK;IACL,mBAFe,mBAAmB,CAIjC;IAED;;;;SAIK;IACL,wBAFe,mBAAmB,CAQjC;IAFC,WAAkB;CAGrB;AA7hBD;;;;GAIG;AACH;IACE,0BAGC;IAFC,eAAe;IACf,iBAAuB;IAGzB,+BAGC;IAFC,mBAA4B;IAI9B,sBAGC;IAED,4CAGC;IAED,0CAGC;IAED;;;;;SAKK;IACL,iBAFe,oBAAoB,CAIlC;IAED;;;;;SAKK;IACL,cAFe,iBAAiB,CAI/B;IAED;;;;;SAKK;IACL,cAFe,iBAAiB,CAI/B;IAED;;;;;SAKK;IACL,kBAFe,iBAAiB,CAI/B;IAED;;;;;SAKK;IACL,eAFe,kBAAkB,CAIhC;IAED;;;;;SAKK;IACL,UAFe,mBAAmB,CAIjC;CACF;AAED;;;GAGG;AACH;IACE,iCAEC;IADC,oBAAoC;IAGtC;;;;SAIK;IACL,MAFe,cAAc,CAI5B;IAED;;;;;SAKK;IACL,eAFe,WAAW,gBAAgB,CAIzC;IAED;;;;;SAKK;IACL,aAFe,WAAW,gBAAgB,CAIzC;CACF"} \ No newline at end of file +{"version":3,"file":"trigger-builder.d.ts","sourceRoot":"","sources":["../../rules/trigger-builder.js"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/types/triggers.d.ts b/types/triggers.d.ts index 9272e2bc6..0f4a1c478 100644 --- a/types/triggers.d.ts +++ b/types/triggers.d.ts @@ -148,7 +148,7 @@ export function GenericCronTrigger(expression: string, triggerName?: string): Ho * TimeOfDayTrigger('19:00'); * * @memberof triggers - * @param {string} time the time expression defining the triggering schedule + * @param {string} time the time expression (in `HH:mm`) defining the triggering schedule * @param {string} [triggerName] the optional name of the trigger to create */ export function TimeOfDayTrigger(time: string, triggerName?: string): HostTrigger; diff --git a/types/triggers.d.ts.map b/types/triggers.d.ts.map index 513de70e2..14bc13fd4 100644 --- a/types/triggers.d.ts.map +++ b/types/triggers.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../triggers.js"],"names":[],"mappings":"AAwCA;;;;;;;;;;;GAWG;AACH,6CALW,MAAM,SACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;;;;;GAcG;AACH,mDALW,MAAK,MAAM,aACX,MAAM,aACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;;GAWG;AACH,mDAJW,MAAK,MAAM,UACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;;GAWG;AACH,+CAJW,MAAK,MAAM,YACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;;GAWG;AACH,qDALW,MAAK,MAAM,aACX,MAAM,aACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;GAUG;AACH,qDAJW,MAAK,MAAM,UACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;GAUG;AACH,iDAJW,MAAK,MAAM,YACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;GAUG;AACH,mDAJW,MAAM,WACN,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;;GAWG;AACH,mDALW,MAAM,WACN,MAAM,mBACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;;;;GAaG;AACH,oDAHW,MAAM,GAAC,MAAM,gBACb,MAAM,eAKb;AAEJ;;;;;;;;;GASG;AACH,+CAHW,MAAM,gBACN,MAAM,eAKb;AAEJ;;;;;;;;;GASG;AACH,uCAHW,MAAM,gBACN,MAAM,eAKb;AAEJ;;;;;;;;;;GAUG;AACH,4CAJW,MAAK,MAAM,aACX,OAAO,gBACP,MAAM,eAMb;AAEJ;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,0CAPW,MAAM,YACN,MAAM,iBACN,MAAM,iBACN,MAAM,kBACN,MAAM,gBACN,MAAM,eASb;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,sCAhBW,MAAM,gBACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,mBACN,MAAM,aACN,MAAM,gBACN,MAAM,qBACN,MAAM,qBACN,MAAM,mBACN,MAAM,mBACN,MAAM,mBACN,MAAM,uBACN,MAAM,gBACN,MAAM,eAkBb"} \ No newline at end of file +{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../triggers.js"],"names":[],"mappings":"AA4CA;;;;;;;;;;;GAWG;AACH,6CALW,MAAM,SACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;;;;;GAcG;AACH,mDALW,MAAK,MAAM,aACX,MAAM,aACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;;GAWG;AACH,mDAJW,MAAK,MAAM,UACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;;GAWG;AACH,+CAJW,MAAK,MAAM,YACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;;GAWG;AACH,qDALW,MAAK,MAAM,aACX,MAAM,aACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;GAUG;AACH,qDAJW,MAAK,MAAM,UACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;GAUG;AACH,iDAJW,MAAK,MAAM,YACX,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;GAUG;AACH,mDAJW,MAAM,WACN,MAAM,gBACN,MAAM,eAMb;AAEJ;;;;;;;;;;;GAWG;AACH,mDALW,MAAM,WACN,MAAM,mBACN,MAAM,gBACN,MAAM,eAOb;AAEJ;;;;;;;;;;;;;GAaG;AACH,oDAHW,MAAM,GAAC,MAAM,gBACb,MAAM,eAKb;AAEJ;;;;;;;;;GASG;AACH,+CAHW,MAAM,gBACN,MAAM,eAKb;AAEJ;;;;;;;;;GASG;AACH,uCAHW,MAAM,gBACN,MAAM,eAKb;AAEJ;;;;;;;;;;GAUG;AACH,4CAJW,MAAK,MAAM,aACX,OAAO,gBACP,MAAM,eAMb;AAEJ;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,0CAPW,MAAM,YACN,MAAM,iBACN,MAAM,iBACN,MAAM,kBACN,MAAM,gBACN,MAAM,eASb;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,sCAhBW,MAAM,gBACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,mBACN,MAAM,aACN,MAAM,gBACN,MAAM,qBACN,MAAM,qBACN,MAAM,mBACN,MAAM,mBACN,MAAM,mBACN,MAAM,uBACN,MAAM,gBACN,MAAM,eAkBb"} \ No newline at end of file