There are some tricks that need to be done in the code to make the OHRT library work in Blockly which results in some over done code.
In a text based JS this code can be reduced to:
const ohrt = require('openhab_rules_tools');
// validating the library versions is not something you'd typically need to do
rules.JSRule({
name: `Stairway 12`,
id: `stairway12`,
tags: [`_DYNAMIC_`],
overwrite: `true`,
description: `Schodowe 12`,
triggers: [triggers.ItemStateChangeTrigger('Light_12a_2x_Sensor_Switch_select_state'),triggers.ItemStateChangeTrigger('Light_12b_2x_Sensor_Switch_select_state')],
execute: (event) => {
console.info(">----NEW-12---" + event.itemName + " Received: " + event.newState)
cache.private.get('ruleTimer12', () => ohrt.RateLimit()).run(() => {
console.info("no rate limit - 12 - Received ON");
var a = items.Light_12a_2x_Sensor_Switch_select_state;
var b = items.Light_12b_2x_Sensor_Switch_select_state;
if(a.state != event.newState) {
console.info("12a state is " + a.state + " - Sending " + event.newState);
a.sendCommand(event.itemState);
}
if(b.state != event.newState) {
console.info("12b state is " + b.state + " - Sending " + event.newState);
b.sendCommand(event.itemState);
}
}, 'PT1S')
});
rules.JSRule({
name: `Stairway 5`,
id: `stairway5`,
tags: [`_DYNAMIC_`],
overwrite: `true`,
description: `Stairway switches 5`,
triggers: [triggers.ItemStateChangeTrigger('Light_5a_2x_Sensor_Switch_select_state'),triggers.ItemStateChangeTrigger('Light_5b_2x_Sensor_Switch_select_state')],
execute: (event) => {
console.info(">----NEW-12---" + event.itemName + " Received: " + event.newState)
cache.private.get('ruleTimer12', () => ohrt.RateLimit()).run(() => {
console.info("no rate limit - 12 - Received ON");
var a = items.Light_5a_2x_Sensor_Switch_select_state;
var b = items.Light_5b_2x_Sensor_Switch_select_state;
if(a.state != event.newState) {
console.info("12a state is " + a.state + " - Sending " + event.newState);
a.sendCommand(event.itemState);
}
if(b.state != event.newState) {
console.info("12b state is " + b.state + " - Sending " + event.newState);
b.sendCommand(event.itemState);
}
}, 'PT1S')
})
Though both of these rules are essentially identical and could be easily reduced into one rule which will be way easier to maintain in the long run.
const ohrt = require('openhab_rules_tools');
rules.JSRule({
name: `Stairway 12`,
id: `stairway12`,
tags: [`_DYNAMIC_`],
overwrite: `true`,
description: `Schodowe 12`,
triggers: [triggers.ItemStateChangeTrigger('Light_12a_2x_Sensor_Switch_select_state'),
triggers.ItemStateChangeTrigger('Light_12b_2x_Sensor_Switch_select_state'),
triggers.ItemStateChangeTrigger('Light_5a_2x_Sensor_Switch_select_state'),
triggers.ItemStateChangeTrigger('Light_5b_2x_Sensor_Switch_select_state')],
execute: (event) => {
console.info(">----NEW-12---" + event.itemName + " Received: " + event.newState)
cache.private.get('ruleTimer12', () => ohrt.RateLimit()).run(() => {
console.info("no rate limit - 12 - Received ON");
// Apply the associated items design pattern
var a = (event.itemName.includes('a_')) ? event.itemName : event.itemName('b_', 'a_');
var b = (event.itemName.includes('b_')) ? event.itemName : event.itemName('a_', 'b');
if(a.state != event.newState) {
console.info(a.name + " state is " + a.state + " - Sending " + event.newState);
a.sendCommand(event.itemState);
}
if(b.state != event.newState) {
console.info(b.name + " state is " + b.state + " - Sending " + event.newState);
b.sendCommand(event.itemState);
}
}, 'PT1S')
});