iobroker.shuttercontrol
Version:
Automatic control for shutters
655 lines (529 loc) • 63.3 kB
JavaScript
'use strict';
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);
});
}
// @ts-ignore
async function shutterAlarm(adapter, alarmType, shutterSettings) {
adapter.log.debug('start shutterAlarm');
const alarmWind1Level = adapter.config.alarmWind1Level;
const alarmWind2Level = adapter.config.alarmWind2Level;
const alarmRainLevel = adapter.config.alarmRainLevel;
const alarmFrostLevel = adapter.config.alarmFrostLevel;
const alarmFireLevel = adapter.config.alarmFireLevel;
const driveDelayUpAstro = adapter.config.driveDelayUpAstro != 0 ? adapter.config.driveDelayUpAstro * 1000 : 20;
let resAlarm; // Filter Area
if (shutterSettings) {
switch (alarmType) {
case 'alarmWind1':
resAlarm = shutterSettings.filter((d) => d.enableAlarmWind1 == true);
break;
case 'alarmWind2':
resAlarm = shutterSettings.filter((d) => d.enableAlarmWind2 == true);
break;
case 'alarmRain':
resAlarm = shutterSettings.filter((d) => d.enableAlarmRain == true);
break;
case 'alarmFrost':
resAlarm = shutterSettings.filter((d) => d.enableAlarmFrost == true);
break;
case 'alarmFire':
resAlarm = shutterSettings.filter((d) => d.enableAlarmFire == true);
break;
}
const result = resAlarm.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) {
const nameDevice = shutterSettings[s].shutterName.replace(/[.;, ]/g, '_');
let convertShutter = false;
if (parseFloat(shutterSettings[s].heightDown) < parseFloat(shutterSettings[s].heightUp)) {
convertShutter = false;
} else if (parseFloat(shutterSettings[s].heightDown) > parseFloat(shutterSettings[s].heightUp)) {
convertShutter = true;
}
const pendingAlarm = await checkPendingAlarm(adapter, shutterSettings[s]);
const _alarmWind1 = adapter.config.alarmWind1 != '' ? await adapter.getForeignStateAsync(adapter.config.alarmWind1).catch((e) => adapter.log.warn(e)) : null;
const statusAlarmWind1 = _alarmWind1?.val !== null && _alarmWind1?.val !== undefined ? _alarmWind1.val : false;
const _alarmWind2 = adapter.config.alarmWind2 != '' ? await adapter.getForeignStateAsync(adapter.config.alarmWind2).catch((e) => adapter.log.warn(e)) : null;
const statusAlarmWind2 = _alarmWind2?.val !== null && _alarmWind2?.val !== undefined ? _alarmWind2.val : false;
const _alarmRain = adapter.config.alarmRain != '' ? await adapter.getForeignStateAsync(adapter.config.alarmRain).catch((e) => adapter.log.warn(e)) : null;
const statusAlarmRain = _alarmRain?.val !== null && _alarmRain?.val !== undefined ? _alarmRain.val : false;
const _alarmFrost = adapter.config.alarmFrost != '' ? await adapter.getForeignStateAsync(adapter.config.alarmFrost).catch((e) => adapter.log.warn(e)) : null;
const statusAlarmFrost = _alarmFrost?.val !== null && _alarmFrost?.val !== undefined ? _alarmFrost.val : false;
const _alarmFire = adapter.config.alarmFire != '' ? await adapter.getForeignStateAsync(adapter.config.alarmFire).catch((e) => adapter.log.warn(e)) : null;
const statusAlarmFire = _alarmFire?.val !== null && _alarmFire?.val !== undefined ? _alarmFire.val : false;
const _triggerState = shutterSettings[s].triggerID != '' ? await adapter.getForeignStateAsync(shutterSettings[s].triggerID).catch((e) => adapter.log.warn(e)) : null;
const currentValue = _triggerState?.val !== null && _triggerState?.val !== undefined ? (`${_triggerState.val}`) : '';
const mustValue = shutterSettings[s].triggerState ? (`${shutterSettings[s].triggerState}`) : '';
const mustValueTilted = shutterSettings[s].triggerStateTilted == 'none' ? (`${shutterSettings[s].triggerState}`) : shutterSettings[s].triggerStateTilted ? (`${shutterSettings[s].triggerStateTilted}`) : '';
switch (alarmType) {
// +++++++++++++++++ Alarm Wind 1 +++++++++++++++
case 'alarmWind1':
if (statusAlarmWind1) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(alarmWind1Level) &&
statusAlarmFire == false) {
if (statusAlarmWind2 == false &&
statusAlarmRain == false &&
statusAlarmFrost == false &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
} else {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmWind1Level);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'wind1';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(alarmWind1Level), nameDevice, 'Alarm #100');
adapter.log.debug(`shutter alarm wind 1 ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(alarmWind1Level) &&
statusAlarmFire == false) {
if ((statusAlarmWind2 == false &&
statusAlarmRain == false &&
statusAlarmFrost == false &&
statusAlarmFire == false)) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
} else {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmWind1Level);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'wind1';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm wind 1 ${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (!statusAlarmWind1) {
if (pendingAlarm == false && statusAlarmFrost == false) {
if (currentValue === mustValue ||
currentValue === mustValueTilted ||
shutterSettings[s].triggerID == '') {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(shutterSettings[s].alarmTriggerLevel)) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].alarmTriggerLevel), nameDevice, 'Alarm Wind 1 ended');
adapter.log.debug(`shutter alarm wind 1 endet and no other alarm is pending ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(shutterSettings[s].alarmTriggerLevel)) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm wind 1 endet and no other alarm is pending ${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
shutterSettings[s].triggerHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].currentHeight = shutterSettings[s].triggerDrive;
shutterSettings[s].currentAction = 'triggered';
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].currentHeight), nameDevice, '#Shutter alarm wind1 end');
adapter.log.debug(`save new trigger action: ${shutterSettings[s].triggerAction}`);
adapter.log.debug(`save new trigger height: ${shutterSettings[s].triggerHeight}%`);
}
}
} else {
adapter.log.info(`Alarm Wind 1 endet for ID: ${shutterSettings[s].shutterName} driving to next highest alarm priority`);
if (statusAlarmFire == false) {
if (statusAlarmFrost == true) {
if (shutterSettings[s].alarmTriggerAction == 'down') {
shutterSettings[s].currentAction = 'frost';
shutterSettings[s].currentHeight = alarmFrostLevel;
} else {
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].currentHeight = shutterSettings[s].alarmTriggerLevel;
}
}
if (statusAlarmWind2 == true) {
shutterSettings[s].currentHeight = alarmWind2Level;
shutterSettings[s].currentAction = 'wind2';
}
if (statusAlarmRain == true) {
shutterSettings[s].currentHeight = alarmRainLevel;
shutterSettings[s].currentAction = 'rain';
}
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].currentHeight), nameDevice, '#Shutter alarm wind1 end');
adapter.log.debug(`shutter alarm ${shutterSettings[s].currentAction} ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
}
}
}
await sleep(driveDelayUpAstro);
break;
// +++++++++++++++++ Alarm Wind 2 +++++++++++++++
case 'alarmWind2':
if (statusAlarmWind2) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(alarmWind2Level) &&
statusAlarmFire == false) {
if (statusAlarmWind1 == false &&
statusAlarmRain == false &&
statusAlarmFrost == false &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
} else {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmWind2Level);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'wind2';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(alarmWind2Level), nameDevice, '#Shutter alarm wind2');
adapter.log.debug(`shutter alarm wind 2 ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(alarmWind2Level)) {
if (statusAlarmRain == false &&
statusAlarmFrost == false &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
} else {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmWind2Level);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'wind2';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm wind 2 ${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (statusAlarmWind2 == false) {
if (pendingAlarm == false && statusAlarmFrost == false) {
if (currentValue === mustValue ||
currentValue === mustValueTilted ||
shutterSettings[s].triggerID == '') {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(shutterSettings[s].alarmTriggerLevel) &&
statusAlarmFire == false) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].alarmTriggerLevel), nameDevice, 'Alarm Wind 2 end');
adapter.log.debug(`shutter alarm wind 2 endet and no other alarm is pending ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(shutterSettings[s].alarmTriggerLevel)) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm wind 2 endet and no other alarm is pending ${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
shutterSettings[s].triggerHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].currentHeight = shutterSettings[s].triggerDrive;
shutterSettings[s].currentAction = 'triggered';
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].currentHeight), nameDevice, '#Shutter alarm wind 2 end');
adapter.log.debug(`save new trigger height: ${shutterSettings[s].triggerHeight}%`);
adapter.log.debug(`save new trigger action: ${shutterSettings[s].triggerAction}`);
}
}
} else {
adapter.log.info(`Alarm Wind 2 endet for ID: ${shutterSettings[s].shutterName} driving to next highest alarm priority`);
if (statusAlarmFire == false) {
if (statusAlarmFrost == true) {
if (shutterSettings[s].alarmTriggerAction == 'down') {
shutterSettings[s].currentAction = 'frost';
shutterSettings[s].currentHeight = alarmFrostLevel;
} else {
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].currentHeight = shutterSettings[s].alarmTriggerLevel;
}
}
if (statusAlarmWind1 == true) {
shutterSettings[s].currentHeight = alarmWind1Level;
shutterSettings[s].currentAction = 'wind1';
}
if (statusAlarmRain == true) {
shutterSettings[s].currentHeight = alarmRainLevel;
shutterSettings[s].currentAction = 'rain';
}
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].currentHeight), nameDevice, '#Shutter alarm wind 2 end');
adapter.log.debug(`shutter alarm ${shutterSettings[s].currentAction} ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
}
}
}
await sleep(driveDelayUpAstro);
break;
// +++++++++++++++++ Alarm Rain +++++++++++++++
case 'alarmRain':
if (statusAlarmRain == true) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(alarmRainLevel) &&
statusAlarmFire == false) {
if (statusAlarmWind1 == false &&
statusAlarmWind2 == false &&
statusAlarmFrost == false &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
} else {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmRainLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'rain';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(alarmRainLevel), nameDevice, '#Shutter alarm Rain');
adapter.log.debug(`shutter alarm rain ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(alarmRainLevel) &&
statusAlarmFire == false) {
if (statusAlarmWind1 == false &&
statusAlarmWind2 == false &&
statusAlarmFrost == false &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
} else {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmRainLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'rain';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm rain ${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (statusAlarmRain == false) {
if (pendingAlarm == false && statusAlarmFrost == false) {
if (currentValue === mustValue ||
currentValue === mustValueTilted ||
shutterSettings[s].triggerID == '') {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(shutterSettings[s].alarmTriggerLevel)) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].alarmTriggerLevel), nameDevice, 'Alarm rain end');
adapter.log.debug(`shutter alarm rain endet and no other alarm is pending ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(shutterSettings[s].alarmTriggerLevel)) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm rain endet and no other alarm is pending ${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined) {
shutterSettings[s].triggerHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].currentHeight = shutterSettings[s].triggerDrive;
shutterSettings[s].currentAction = 'triggered';
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].currentHeight), nameDevice, '#Shutter alarm rain end');
adapter.log.debug(`save new trigger action: ${shutterSettings[s].triggerAction}`);
adapter.log.debug(`save new trigger height: ${shutterSettings[s].triggerHeight}%`);
}
}
} else {
adapter.log.info(`Alarm Rain endet for ID: ${shutterSettings[s].shutterName} driving to next highest alarm priority`);
if (statusAlarmFire == false) {
if (statusAlarmFrost == true) {
if (shutterSettings[s].alarmTriggerAction == 'down') {
shutterSettings[s].currentAction = 'frost';
shutterSettings[s].currentHeight = alarmFrostLevel;
} else {
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].currentHeight = shutterSettings[s].alarmTriggerLevel;
}
}
if (statusAlarmWind1 == true) {
shutterSettings[s].currentHeight = alarmWind1Level;
shutterSettings[s].currentAction = 'wind1';
}
if (statusAlarmWind2 == true) {
shutterSettings[s].currentHeight = alarmWind2Level;
shutterSettings[s].currentAction = 'wind2';
}
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].currentHeight), nameDevice, '#Shutter alarm rain end');
adapter.log.debug(`shutter alarm ${shutterSettings[s].currentAction} ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
}
}
}
await sleep(driveDelayUpAstro);
break;
// +++++++++++++++++ Alarm Frost +++++++++++++++
case 'alarmFrost':
if (statusAlarmFrost == true) {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name).catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null &&
_shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(alarmFrostLevel) &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
if (statusAlarmWind1 == false &&
statusAlarmWind2 == false &&
statusAlarmRain == false &&
statusAlarmFire == false) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
}
if ((shutterSettings[s].triggerHeight < parseFloat(alarmFrostLevel) &&
convertShutter == false) ||
(shutterSettings[s].triggerHeight > parseFloat(alarmFrostLevel) &&
convertShutter == true)) {
shutterSettings[s].triggerHeight = parseFloat(alarmFrostLevel);
shutterSettings[s].triggerAction = 'frost';
}
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined == shutterSettings[s].heightDown &&
(currentValue === mustValue ||
currentValue === mustValueTilted ||
currentValue == '')) {
if (statusAlarmWind1 == false &&
statusAlarmWind2 == false &&
statusAlarmRain == false &&
statusAlarmFire == false) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
if ((Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound < parseFloat(alarmFrostLevel) &&
convertShutter == false) ||
(Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound > parseFloat(alarmFrostLevel) &&
convertShutter == true)) {
shutterSettings[s].currentHeight = parseFloat(alarmFrostLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'frost';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(alarmFrostLevel), nameDevice, '#Shutter alarm frost');
adapter.log.debug(`shutter alarm frost ${shutterSettings[s].shutterName} old height: ${shutterSettings[s].oldHeight}% new height: ${shutterSettings[s].currentHeight}%`);
}
}
} else if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound == parseFloat(alarmFrostLevel) &&
statusAlarmFire == false) {
if (currentValue != '' &&
currentValue != mustValue &&
currentValue != mustValueTilted &&
shutterSettings[s].driveAfterClose == true) {
if (statusAlarmWind1 == false &&
statusAlarmWind2 == false &&
statusAlarmRain == false &&
statusAlarmFire == false) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].triggerHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].triggerAction;
}
} else if (currentValue === mustValue ||
currentValue === mustValueTilted ||
currentValue == '') {
if (statusAlarmWind1 == false &&
statusAlarmWind2 == false &&
statusAlarmRain == false &&
statusAlarmFire == false) {
shutterSettings[s].alarmTriggerLevel = shutterSettings[s].currentHeight;
shutterSettings[s].alarmTriggerAction = shutterSettings[s].currentAction;
}
}
shutterSettings[s].currentHeight = parseFloat(alarmFrostLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = 'frost';
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterInfo(adapter, shutterSettings, shutterSettings[s], nameDevice);
adapter.log.debug(`shutter alarm frost${shutterSettings[s].shutterName} already at: ${shutterSettings[s].currentHeight}% - setting current action: ${shutterSettings[s].currentAction}`);
}
} else if (statusAlarmFrost == false) {
if (pendingAlarm == false) {
if (currentValue === mustValue ||
currentValue === mustValueTilted ||
shutterSettings[s].triggerID == '') {
const _shutterState = await adapter.getForeignStateAsync(shutterSettings[s].name)
.catch((e) => adapter.log.warn(e));
if (_shutterState?.val !== null && _shutterState?.val !== undefined &&
Math.round(parseFloat(_shutterState.val) / adapter.config.shutterStateRound) * adapter.config.shutterStateRound != parseFloat(shutterSettings[s].alarmTriggerLevel)) {
shutterSettings[s].currentHeight = parseFloat(shutterSettings[s].alarmTriggerLevel);
shutterSettings[s].triggerHeight = shutterSettings[s].currentHeight;
shutterSettings[s].currentAction = shutterSettings[s].alarmTriggerAction;
shutterSettings[s].triggerAction = shutterSettings[s].currentAction;
await setShutterState(adapter, shutterSettings, shutterSettings[s], parseFloat(shutterSettings[s].alarmTriggerLevel), nameDevice, 'Alarm frost ended');
adapter.log