iobroker.shuttercontrol
Version:
Automatic control for shutters
260 lines (199 loc) • 22.3 kB
JavaScript
;
const shutterState = require('./shutterState.js'); // shutterState
const setShutterState = require('./setShutter.js').setShutterState; // set Shutter State
const setShutterInfo = require('./setShutter.js').setShutterInfo; // set Shutter State
let timerSleep = 0;
async function sleep(ms) {
return new Promise(async (resolve) => {
// @ts-ignore
timerSleep = setTimeout(async () => resolve(), ms);
});
}
async function triggerChange(resTriggerChange, adapter, shutterSettings) {
if (shutterSettings) {
const arrayChangeTrigger = shutterSettings.filter((d) => d.triggerID == resTriggerChange); // Filter changed Trigger
const result = arrayChangeTrigger.filter((d) => d.enabled === true || d.enabled === 'true'); // Filter enabled
for (const i in result) {
for (const s in shutterSettings) {
if (shutterSettings[s].shutterName == result[i].shutterName) {
if (shutterSettings[s].triggerChange == 'onlyUp' ||
shutterSettings[s].triggerChange == 'upDown' ||
(shutterSettings[s].triggerChange == 'off' && shutterSettings[s].driveAfterClose == true)) {
const nameDevice = shutterSettings[s].shutterName.replace(/[.;, ]/g, '_');
const _autoUpState = await adapter.getStateAsync(`shutters.autoUp.${nameDevice}`).catch((e) => adapter.log.warn(e));
if (shutterSettings[s]?.ignoreTriggerAutoState === true || _autoUpState?.val === true) {
const convertShutter = parseInt(shutterSettings[s].heightDown) < parseInt(shutterSettings[s].heightUp) ? false : true;
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter conversion is: ${convertShutter}`);
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
const mustValue = (`${shutterSettings[s].triggerState}`);
const mustValueTilted = shutterSettings[s].triggerStateTilted == 'none' ? (`${shutterSettings[s].triggerState}`) : (`${shutterSettings[s].triggerStateTilted}`);
let currentValue = _triggerState?.val !== null && _triggerState?.val !== undefined ? (`${_triggerState.val}`) : '';
if (currentValue != mustValue) {
const setTriggerHeight = currentValue == mustValueTilted ? parseFloat(shutterSettings[s].triggerDriveTildet) : parseFloat(shutterSettings[s].triggerDrive);
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name).catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter current state.val is: ${Math.round(_shutterState.val / adapter.config.shutterStateRound) * adapter.config.shutterStateRound}%`);
}
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter trigger drive-up is: ${setTriggerHeight}%`);
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter trigger change is: ${shutterSettings[s].triggerChange}`);
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != setTriggerHeight &&
shutterSettings[s].triggerChange != 'off' &&
((parseFloat(shutterSettings[s].triggerDriveTildet) == setTriggerHeight &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != setTriggerHeight &&
shutterSettings[s].currentAction == 'triggered') ||
(Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound < setTriggerHeight &&
convertShutter == false) ||
(Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound > setTriggerHeight &&
convertShutter == true))) {
await sleep(shutterSettings[s].trigDelyUp ? shutterSettings[s].trigDelyUp * 1000 : 10);
shutterSettings[s].triggerHeight = shutterSettings[s].currentAction != 'triggered' ? Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound : shutterSettings[s].triggerHeight;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction != 'triggered' ? shutterSettings[s].currentAction : shutterSettings[s].triggerAction;
adapter.log.debug(`#1 save trigger height: ${shutterSettings[s].triggerHeight}% for device ${shutterSettings[s].shutterName}`);
adapter.log.debug(`#1 save trigger action: ${shutterSettings[s].triggerAction} for device ${shutterSettings[s].shutterName}`);
adapter.log.info(`#1 Set ID: ${shutterSettings[s].shutterName} value: ${setTriggerHeight}%`);
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
const mustValue = (`${shutterSettings[s].triggerState}`);
currentValue = _triggerState?.val !== null && _triggerState?.val !== undefined ? (`${_triggerState.val}`) : '';
if (currentValue != mustValue) {
shutterSettings[s].currentHeight = setTriggerHeight;
shutterSettings[s].currentAction = 'triggered';
adapter.log.debug(`#1 current height: ${shutterSettings[s].currentHeight}% for device ${shutterSettings[s].shutterName}`);
adapter.log.debug(`#1 current action: ${shutterSettings[s].currentAction} for device ${shutterSettings[s].shutterName}`);
await setShutterState(adapter, shutterSettings, shutterSettings[s], setTriggerHeight, nameDevice, 'triggered #1')
.catch((e) => adapter.log.warn(`#triggerChange 1: ${e}`));
adapter.log.debug(`${shutterSettings[s].shutterName} - window is still open -> driving now to: ${setTriggerHeight}%`);
}
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
shutterSettings[s].triggerHeight = shutterSettings[s].currentAction != 'triggered' ? Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound : shutterSettings[s].triggerHeight;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction != 'triggered' ? shutterSettings[s].currentAction : shutterSettings[s].triggerAction;
adapter.log.debug(`#2 save trigger action: ${(shutterSettings[s].currentAction != 'triggered' ? shutterSettings[s].currentAction : shutterSettings[s].triggerAction)} for device: ${shutterSettings[s].shutterName}`);
adapter.log.debug(`#2 save trigger height: ${shutterSettings[s].triggerHeight}% for device: ${shutterSettings[s].shutterName}`);
await shutterState(shutterSettings[s].name, adapter, shutterSettings, false);
}
}
}
}
if (shutterSettings[s].triggerChange == 'onlyDown' ||
shutterSettings[s].triggerChange == 'upDown') {
const nameDevice = shutterSettings[s].shutterName.replace(/[.;, ]/g, '_');
const _autoDownState = await adapter.getStateAsync(`shutters.autoDown.${nameDevice}`).catch((e) => adapter.log.warn(e));
if (shutterSettings[s]?.ignoreTriggerAutoState === true || _autoDownState?.val === true) {
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
if (_triggerState?.val !== null && _triggerState?.val !== undefined) {
const currentValue = (`${_triggerState.val}`);
const mustValue = (`${shutterSettings[s].triggerState}`);
if (currentValue === mustValue) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name).catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter current state.val is: ${Math.round(_shutterState.val / adapter.config.shutterStateRound) * adapter.config.shutterStateRound}%`);
}
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter current Height is: ${shutterSettings[s].currentHeight}%`);
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter trigger Height is: ${shutterSettings[s].triggerHeight}%`);
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter trigger Action is: ${shutterSettings[s].triggerAction}`);
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter trigger Change is: ${shutterSettings[s].triggerChange}`);
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
shutterSettings[s].triggerHeight != null &&
shutterSettings[s].triggerAction != null &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != shutterSettings[s].triggerHeight &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(shutterSettings[s].currentHeight) &&
shutterSettings[s].triggerChange != 'off') {
await sleep(shutterSettings[s].trigDelyDown ? shutterSettings[s].trigDelyDown * 1000 : 10);
if (shutterSettings[s].triggerAction == '') {
adapter.log.debug(`Warning! - not allowed empty values detected - close your window and initialize your shutters with button up! - triggerAction: ${shutterSettings[s].triggerAction} at device: ${shutterSettings[s].shutterName}`);
}
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
if (_triggerState?.val !== null && _triggerState?.val !== undefined) {
const currentValue = (`${_triggerState.val}`);
const mustValue = (`${shutterSettings[s].triggerState}`);
if (currentValue === mustValue) {
shutterSettings[s].currentHeight = shutterSettings[s].triggerHeight;
shutterSettings[s].currentAction = shutterSettings[s].triggerAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].triggerHeight), nameDevice, 'Window is still closed -> drive to last height:')
.catch((e) => adapter.log.warn(`#triggerChange 2: ${e}`));
adapter.log.debug(`save back trigger action: ${shutterSettings[s].triggerAction} for device: ${shutterSettings[s].shutterName}`);
}
}
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
shutterSettings[s].triggerHeight != null &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == shutterSettings[s].triggerHeight &&
shutterSettings[s].triggerChange != 'off') {
if (shutterSettings[s].triggerAction == '') {
adapter.log.debug(`Warning! - not allowed empty values detected - close your window and initialize your shutters with button up! - triggerAction: ${shutterSettings[s].triggerAction} at device: ${shutterSettings[s].shutterName}`);
}
shutterSettings[s].currentHeight = shutterSettings[s].triggerHeight;
shutterSettings[s].currentAction = shutterSettings[s].triggerAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`#1 shutter trigger released ${shutterSettings[s].shutterName} already in place: ${shutterSettings[s].triggerHeight}%`);
adapter.log.debug(`save back trigger action: ${shutterSettings[s].triggerAction} for device ${shutterSettings[s].shutterName}`);
} else if (!_shutterState?.val !== null && _shutterState?.val !== undefined || shutterSettings[s].triggerHeight == null) {
adapter.log.debug(`Nothing sent - triggerHeight undefined!! triggerHeigth: ${shutterSettings[s].triggerHeight}%`);
}
}
}
}
}
if (shutterSettings[s].triggerChange == 'off' &&
shutterSettings[s].driveAfterClose == true) {
const nameDevice = shutterSettings[s].shutterName.replace(/[.;, ]/g, '_');
const _autoDownState = await adapter.getStateAsync(`shutters.autoDown.${nameDevice}`).catch((e) => adapter.log.warn(e));
if (shutterSettings[s]?.ignoreTriggerAutoState === true || _autoDownState?.val === true) {
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
if (_triggerState?.val !== null && _triggerState?.val !== undefined) {
const currentValue = (`${_triggerState.val}`);
const mustValue = (`${shutterSettings[s].triggerState}`);
const mustValueTilted = shutterSettings[s].triggerStateTilted == 'none' ? (`${shutterSettings[s].triggerState}`) : (`${shutterSettings[s].triggerStateTilted}`);
if (currentValue === mustValue ||
currentValue === mustValueTilted) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name).catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter current state.val is: ${Math.round(_shutterState.val / adapter.config.shutterStateRound) * adapter.config.shutterStateRound}%`);
}
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter trigger Height is: ${shutterSettings[s].triggerHeight}%`);
adapter.log.debug(`${shutterSettings[s].shutterName} - shutter height down is: ${shutterSettings[s].heightDown}%`);
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
shutterSettings[s].triggerHeight != null &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != shutterSettings[s].triggerHeight &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != shutterSettings[s].heightDown) {
await sleep(shutterSettings[s].trigDelyDown ? shutterSettings[s].trigDelyDown * 1000 : 10);
if (shutterSettings[s].triggerAction == '') {
adapter.log.debug(`Warning! - not allowed empty values detected - close your window and initialize your shutters with button up! - triggerAction: ${shutterSettings[s].triggerAction} at device: ${shutterSettings[s].shutterName}`);
}
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
if (_triggerState?.val !== null && _triggerState?.val !== undefined) {
const currentValue = (`${_triggerState.val}`);
const mustValue = (`${shutterSettings[s].triggerState}`);
if (currentValue === mustValue) {
shutterSettings[s].currentHeight = shutterSettings[s].triggerHeight;
shutterSettings[s].currentAction = shutterSettings[s].triggerAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].triggerHeight), nameDevice, 'Window was closed -> change to last requested height:')
.catch((e) => adapter.log.warn(`#triggerChange 2: ${e}`));
adapter.log.debug(`save back trigger action: ${shutterSettings[s].triggerAction} for device ${shutterSettings[s].shutterName}`);
}
}
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined && shutterSettings[s].triggerHeight != null &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == shutterSettings[s].triggerHeight) {
if (shutterSettings[s].triggerAction == '') {
adapter.log.debug(`Warning! - not allowed empty values detected - close your window and initialize your shutters with button up! - triggerAction: ${shutterSettings[s].triggerAction} at device: ${shutterSettings[s].shutterName}`);
}
shutterSettings[s].currentHeight = shutterSettings[s].triggerHeight;
shutterSettings[s].currentAction = shutterSettings[s].triggerAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`#2 shutter trigger released ${shutterSettings[s].shutterName} already in place: ${shutterSettings[s].triggerHeight}%`);
adapter.log.debug(`save back trigger action: ${shutterSettings[s].triggerAction} for device ${shutterSettings[s].shutterName}`);
} else if (!_shutterState?.val !== null && _shutterState?.val !== undefined || shutterSettings[s].triggerHeight == null) {
adapter.log.debug(`Nothing sent - triggerHeight undefined!! triggerHeigth: ${shutterSettings[s].triggerHeight}%`);
}
}
}
}
}
await sleep(1000);
}
}
}
clearTimeout(timerSleep);
return (shutterSettings);
}
}
module.exports = triggerChange;