Update Irrigation module
This commit is contained in:
@@ -25,13 +25,23 @@ class Equipment {
|
|||||||
|
|
||||||
// Initialization of properties
|
// Initialization of properties
|
||||||
this.name = this.equipmentItem.name;
|
this.name = this.equipmentItem.name;
|
||||||
this.stateItem = items[this.getPropertyItemName('State')];
|
|
||||||
this.watch = new Object();
|
this.watch = new Object();
|
||||||
|
this.timers = new Object();
|
||||||
|
this.timeout = new Object();
|
||||||
|
|
||||||
|
// Check if equipment has state item
|
||||||
|
if (this.hasProperty('State')) {
|
||||||
|
this.stateItem = items[this.getPropertyItemName('State')];
|
||||||
|
this.watch['State'] = new watch.Watch(this.stateItem);
|
||||||
|
} else {
|
||||||
|
console.info(`Item ${this.equipmentItem.name} has no state item`)
|
||||||
|
}
|
||||||
|
|
||||||
// Check if equipment has LowBat item
|
// Check if equipment has LowBat item
|
||||||
if (this.hasProperty('LowBat')) {
|
if (this.hasProperty('LowBat')) {
|
||||||
this.watch['lowBat'] = new watch.Watch(this.getPropertyItemName('LowBat'));
|
this.watch['LowBat'] = new watch.Watch(this.getPropertyItemName('LowBat'));
|
||||||
this.watch['lowBat'].add({
|
this.watch['LowBat'].add({
|
||||||
targetState: 'ON',
|
targetState: 'ON',
|
||||||
alertFunc: () => { this.#notifyLowBat(); },
|
alertFunc: () => { this.#notifyLowBat(); },
|
||||||
alertRepeat: 'PT23H'
|
alertRepeat: 'PT23H'
|
||||||
@@ -68,7 +78,7 @@ class Equipment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.debug(`Return value ${valueName} for ${this.name}: ${returnValue}`);
|
console.debug(`Return value for property ${propertyName} for ${this.name}: ${returnValue}`);
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +117,113 @@ class Equipment {
|
|||||||
class Irrigation extends Equipment {
|
class Irrigation extends Equipment {
|
||||||
constructor(equipmentItem) {
|
constructor(equipmentItem) {
|
||||||
super(equipmentItem);
|
super(equipmentItem);
|
||||||
|
|
||||||
|
// Initialization of properties
|
||||||
|
this.valves = new Object();
|
||||||
|
|
||||||
|
// Add on/off watch rule
|
||||||
|
this.watch['State'].add({
|
||||||
|
targetState: 'ON',
|
||||||
|
alertFunc: () => { this.#irrigationOn(); },
|
||||||
|
endAlertFunc: () => { this.#irrigationOff(); },
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fetch irrigation valves and initialize as subequipment
|
||||||
|
for (let valve of this.equipmentItem.members.filter(item => { return item.tags.includes('IrrigationValve'); } )) {
|
||||||
|
try {
|
||||||
|
this.valves[valve.name] = new IrrigationValve(valve);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
gc() {
|
||||||
|
console.info('Deinitialization of irrigation valves for ' + this.name);
|
||||||
|
|
||||||
|
// Delete all watchObjects
|
||||||
|
for (let valve of Object.keys(this.valves)) {
|
||||||
|
this.valves[valve].gc();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call function to deinitialize irrigation
|
||||||
|
super.gc();
|
||||||
|
}
|
||||||
|
|
||||||
|
#irrigationOn() {
|
||||||
|
console.info(`Irrigation ${this.name} received command on`);
|
||||||
|
|
||||||
|
// Fetch valves with AutoMode enabled
|
||||||
|
let autoValves = Object.keys(this.valves).filter(element => { return this.valves[element].getValue('AutoMode', 'OFF') == 'ON'} );
|
||||||
|
|
||||||
|
// Skip if no valves with AutoMode enabled are available
|
||||||
|
if (autoValves.length == 0) {
|
||||||
|
console.info('No valves with AutoMode enabled available');
|
||||||
|
this.stateItem.sendCommandIfDifferent('OFF');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let totalDuration = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < autoValves.length; i++) {
|
||||||
|
let currentValve = autoValves[i];
|
||||||
|
let nextValve = autoValves[(i + 1)];
|
||||||
|
let duration = time.toZDT(this.valves[currentValve].getValue('Duration', 'PT30S')).getMillisFromNow();
|
||||||
|
|
||||||
|
// calculate start and endtimes for valve
|
||||||
|
let startTime = time.toZDT(totalDuration)
|
||||||
|
totalDuration = totalDuration + duration;
|
||||||
|
let endTime = time.toZDT(totalDuration);
|
||||||
|
|
||||||
|
// Set timers for valve
|
||||||
|
this.valves[currentValve].timers['autoOn'] = actions.ScriptExecution.createTimer(
|
||||||
|
startTime,
|
||||||
|
() => {
|
||||||
|
this.valves[currentValve].stateItem.sendCommandIfDifferent('ON');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
this.valves[currentValve].timers['autoOff'] = actions.ScriptExecution.createTimer(
|
||||||
|
endTime,
|
||||||
|
() => {
|
||||||
|
this.valves[currentValve].stateItem.sendCommandIfDifferent('OFF');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Stop irrigation after the last valve
|
||||||
|
if (nextValve == undefined) {
|
||||||
|
console.log('No further valves with autoMode enabled available');
|
||||||
|
this.timers['autoOff'] = actions.ScriptExecution.createTimer(
|
||||||
|
endTime.plusSeconds(5),
|
||||||
|
() => {
|
||||||
|
console.debug(`Switch irrigation ${this.name} to off`)
|
||||||
|
this.stateItem.sendCommandIfDifferent('OFF');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#irrigationOff() {
|
||||||
|
console.info(`Irrigation ${this.name} received command off`);
|
||||||
|
|
||||||
|
if (this.timers.hasOwnProperty('autoOff') && this.timers['autoOff'].isActive()) {
|
||||||
|
console.debug(`Cancel stop timer for irrigation`);
|
||||||
|
this.timers['autoOff'].cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let valve of Object.keys(this.valves)) {
|
||||||
|
if (this.valves[valve].timers.hasOwnProperty('autoOn') && this.valves[valve].timers['autoOn'].isActive()) {
|
||||||
|
console.debug(`Cancel start timer for valve ${valve}`);
|
||||||
|
this.valves[valve].timers['autoOn'].cancel();
|
||||||
|
}
|
||||||
|
if (this.valves[valve].timers.hasOwnProperty('autoOff') && this.valves[valve].timers['autoOff'].isActive()) {
|
||||||
|
console.debug(`Cancel stop timer for valve ${valve}`);
|
||||||
|
this.valves[valve].timers['autoOff'].cancel();
|
||||||
|
}
|
||||||
|
this.valves[valve].stateItem.sendCommandIfDifferent('OFF')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,11 +231,10 @@ class IrrigationValve extends Equipment {
|
|||||||
constructor(equipmentItem) {
|
constructor(equipmentItem) {
|
||||||
super(equipmentItem);
|
super(equipmentItem);
|
||||||
|
|
||||||
this.watch['state'] = new watch.Watch(this.stateItem.name);
|
this.watch['State'].add({
|
||||||
this.watch['state'].add({
|
|
||||||
targetState: 'ON',
|
targetState: 'ON',
|
||||||
alertFunc: () => { this.stateItem.sendCommand('OFF'); },
|
alertFunc: () => { this.stateItem.sendCommand('OFF'); },
|
||||||
alertDelay: 'PT59M'
|
alertDelay: 'PT30M'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,8 +243,7 @@ class TowelRadiator extends Equipment {
|
|||||||
constructor(equipmentItem) {
|
constructor(equipmentItem) {
|
||||||
super(equipmentItem);
|
super(equipmentItem);
|
||||||
|
|
||||||
this.watch['state'] = new watch.Watch(this.stateItem.name);
|
this.watch['State'].add({
|
||||||
this.autoOff = this.watch['state'].add({
|
|
||||||
targetState: 'ON',
|
targetState: 'ON',
|
||||||
alertFunc: () => { this.stateItem.sendCommand('OFF'); },
|
alertFunc: () => { this.stateItem.sendCommand('OFF'); },
|
||||||
alertDelay: 'PT59M'
|
alertDelay: 'PT59M'
|
||||||
|
|||||||
Reference in New Issue
Block a user