iobroker.heatingcontrol
Version:
HeatingControl Adapter
644 lines (532 loc) • 36.2 kB
JavaScript
/* eslint-disable prefer-template */
"use strict";
let parentAdapter;
//=========================================================================================
// support functions for vis
let TempDecreaseMode;
let ProfileType;
let UsedRooms;
let OldChoosenRoom = "none";
let ChoosenRoom = "";
let RefreshingVis = false;
// used for absolut increase/decrease temperatures
let AbsTempValueListValue = "0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25";
let AbsTempValueListText = "inaktiv;1°C;2°C;3°C;4°C;5°C;6°C;7°C;8°C;9°C;10°C;11°C;12°C;13°C;14°C;15°C;16°C;17°C;18°C;19°C;20°C;21°C;22°C;23°C;24°C;25°C";
// used for relative increase/decrease temperatures
let RelTempValueListValue = "0;1;2;3;4;5;6;7;8;9;10";
let RelTempDivValueListText = "inaktiv;-1°C;-2°C;-3°C;-4°C;-5°C;-6°C;-7°C;-8°C;-9°C;-10°C";
let RelTempAddValueListText = "inaktiv;+1°C;+2°C;+3°C;+4°C;+5°C;+6°C;+7°C;+8°C;+9°C;+10°C";
//used for override temperature
let OverrideTempValueListValue = "0;20;21;22;23;24;25;26;27;28;29;30";
let OverrideTempValueListText = "inaktiv;20°C;21°C;22°C;23°C;24°C;25°C;26°C;27°C;28°C;29°C;30°C";
//used for profil temperatures, configured from admin
let TempValueListValue = "12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30";
let TempValueListText = "12°C;13°C;14°C;15°C;16°C;17°C;18°C;19°C;20°C;21°C;22°C;23°C;24°C;25°C;26°C;27°C;28°C;29°C;30°C";
let CurrentProfile = -1;
function SetCurrentProfile(profile) {
CurrentProfile = profile;
}
async function StartVis(parent) {
parentAdapter = parent;
//pittini vis
if (parentAdapter.config.UseVisFromPittini) {
await SetData();
await InitRoom(); //Gewählten Raum einlesen, bei Erststart default setzen
//ValueList Vorgabewerte anhand Profileinstellungen erzeugen
await SetProfileValueList();//ValueList Vorgaben für Profile erzeugen
await SetTempDecreaseModeValueLists(); //ValueList Vorgaben (Werte und Texte) für Decreasemodes erzeugen
await SetTrigger(); //Trigger erzeugen
await SetVis(); // Vis initialisieren
}
}
async function SetData() {
try {
let temp = await parentAdapter.getStateAsync("info.TemperatureDecreaseMode");
TempDecreaseMode = temp.val;
parentAdapter.log.debug("TempDecreaseMode " + JSON.stringify(TempDecreaseMode));
temp = await parentAdapter.getStateAsync("info.ProfileType");
ProfileType = temp.val;
parentAdapter.log.debug("ProfileType " + JSON.stringify(ProfileType));
temp = await parentAdapter.getStateAsync("info.UsedRooms");
UsedRooms = temp.val;
parentAdapter.log.debug("UsedRooms " + JSON.stringify(UsedRooms));
} catch (e) {
parentAdapter.log.error("exception in SetData [" + e + "]");
}
}
async function InitRoom() { //Gewählten Raum einlesen, bei Erststart default= erster in der Raumliste setzen
parentAdapter.log.debug("InitRoom called ");
try {
let temp = await parentAdapter.getStateAsync("vis.ChoosenRoom");
if (temp != null && temp !== undefined) {
ChoosenRoom = temp.val;
}
if (ChoosenRoom == "") { //Wenn bei erstem Start noch kein Raum vorhanden (nach anlegen der States), verwende ersten Raum aus der Raumliste
temp = await parentAdapter.getStateAsync("info.UsedRooms");
if (temp != null && temp !== undefined) {
const dummy = temp.val;
if (dummy.includes(";")) { //Wenn ein semikolon in der Raumliste vorhanden ist, sind auch mehrere Räume vorhanden, davon nachfolgend den ersten extrahieren
ChoosenRoom = dummy.substring(0, dummy.indexOf(";")); //In Raumliste nach dem Semikolon suchen und alles links davon extrahieren
parentAdapter.log.debug("ChoosenRoom=" + ChoosenRoom);
} else {
ChoosenRoom = dummy; //Wenn nur ein Raum in Raumliste, diesen verwenden
}
await parentAdapter.setStateAsync("vis.ChoosenRoom", { ack: true, val: ChoosenRoom }); //Bei Erststart ChoosenRoom auf default= erster in der Raumliste setzen
} else {
parentAdapter.log.error("InitRoom: could not read info.UsedRooms");
}
}
await setIsActive(ChoosenRoom);
} catch (e) {
parentAdapter.log.error("exception in InitRoom [" + e + "]");
}
parentAdapter.log.debug("InitRoom done, choosen room is " + ChoosenRoom);
}
async function setIsActive(room) {
if (room == ChoosenRoom) {
//heatingcontrol.0.Rooms.Küche.isActive
const isActive = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + ".isActive");
await parentAdapter.setStateAsync("vis.isActive", { ack: true, val: isActive.val });
}
}
async function changeIsActive(value) {
const isActive = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + ".isActive");
if (isActive.val != value) {
await parentAdapter.setStateAsync("Rooms." + ChoosenRoom + ".isActive", { ack: false, val: value });
}
}
async function SetProfileValueList() { //Einträge für Vis Profil Valuelist erstellen
parentAdapter.log.debug("SetProfileValueList called " + parseInt(parentAdapter.config.NumberOfProfiles, 10));
try {
let ProfileValueListValue = "";
let ProfileValueListText = "";
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfProfiles, 10); x++) {
ProfileValueListValue += ";" + x;
//heatingcontrol.0.Profiles.1.ProfileName
const profileName = await parentAdapter.getStateAsync("Profiles." + x + ".ProfileName");
//parentAdapter.log.debug("got " + JSON.stringify(profileName) + " " + typeof profileName);
if (profileName != null && profileName !== undefined) {
ProfileValueListText += ";" + profileName.val ;
} else {
ProfileValueListText += ";" + x;
}
}
ProfileValueListValue = ProfileValueListValue.slice(1);
ProfileValueListText = ProfileValueListText.slice(1);
parentAdapter.log.debug("SetProfileValueList " + ProfileValueListValue + " " + ProfileValueListText);
await parentAdapter.setStateAsync("vis.ProfileValueListValue", { ack: true, val: ProfileValueListValue });
await parentAdapter.setStateAsync("vis.ProfileValueListText", { ack: true, val: ProfileValueListText });
} catch (e) {
parentAdapter.log.error("exception in SetProfileValueList [" + e + "]");
}
parentAdapter.log.debug("SetProfileValueList done");
}
async function SetTempDecreaseModeValueLists() { //Setzt die Vorgabewerte der Valuelists je nach gewähltem DecreaseMode
parentAdapter.log.debug("SetTempDecreaseModeValueLists called ");
try {
switch (TempDecreaseMode) {
case "relative":
if (parseInt(parentAdapter.config.VisMinDecRelTemp) > 0 && parseInt(parentAdapter.config.VisMaxDecRelTemp) > 0) {
RelTempValueListValue = "0;";
RelTempAddValueListText = "inaktiv;";
RelTempDivValueListText = "inaktiv;";
let tempValueMin = Number(parentAdapter.config.VisMinDecRelTemp);
const tempValueMax = Number(parentAdapter.config.VisMaxDecRelTemp);
if (tempValueMin >= tempValueMax) {
parentAdapter.log.warn("profil parameter vis limits: minimum (" + tempValueMin + "°C) has to be lower then maximum (" + tempValueMax + "°C)");
}
while (tempValueMin <= tempValueMax) {
RelTempValueListValue += tempValueMin + ";";
RelTempAddValueListText += "+" + tempValueMin + "°C;";
RelTempDivValueListText += "-" + tempValueMin + "°C;";
tempValueMin += Number(parentAdapter.config.VisStepWidthDecRelTemp);
}
}
await parentAdapter.setStateAsync("vis.TempValueListValue", { ack: true, val: RelTempValueListValue });
await parentAdapter.setStateAsync("vis.TempAddValueListText", { ack: true, val: RelTempAddValueListText });
await parentAdapter.setStateAsync("vis.TempDivValueListText", { ack: true, val: RelTempDivValueListText });
break;
case "absolute":
if (parseInt(parentAdapter.config.VisMinDecAbsTemp) > 0 && parseInt(parentAdapter.config.VisMaxDecAbsTemp) > 0) {
AbsTempValueListValue = "0;";
AbsTempValueListText = "inaktiv;";
let tempValueMin = Number(parentAdapter.config.VisMinDecAbsTemp);
const tempValueMax = Number(parentAdapter.config.VisMaxDecAbsTemp);
if (tempValueMin < 4.5) {
parentAdapter.log.warn("profil parameter vis limits: for homematic devices minimum value is 4.5°C, current is " + tempValueMin + "°C, please change settings in admin" );
}
if (tempValueMin >= tempValueMax) {
parentAdapter.log.warn("profil parameter vis limits: minimum (" + tempValueMin + "°C) has to be lower then maximum (" + tempValueMax + "°C)");
}
while (tempValueMin <= tempValueMax) {
AbsTempValueListValue += tempValueMin + ";";
AbsTempValueListText += tempValueMin + "°C;";
tempValueMin += Number(parentAdapter.config.VisStepWidthDecAbsTemp);
}
}
await parentAdapter.setStateAsync("vis.TempValueListValue", { ack: true, val: AbsTempValueListValue });
await parentAdapter.setStateAsync("vis.TempAddValueListText", { ack: true, val: AbsTempValueListText });
await parentAdapter.setStateAsync("vis.TempDivValueListText", { ack: true, val: AbsTempValueListText });
break;
}
if (parseInt(parentAdapter.config.VisMinOverrideTemp) > 0 && parseInt(parentAdapter.config.VisMaxOverrideTemp) > 0) {
OverrideTempValueListValue = "0;";
OverrideTempValueListText = "inaktiv;";
let tempValueMin = Number(parentAdapter.config.VisMinOverrideTemp);
const tempValueMax = Number(parentAdapter.config.VisMaxOverrideTemp);
if (tempValueMin < 4.5) {
parentAdapter.log.warn("override vis limit: for homematic devices minimum value is 4.5°C, current is " + tempValueMin + "°C, please change settings in admin");
}
if (tempValueMin >= tempValueMax) {
parentAdapter.log.warn("override vis limit: minimum (" + tempValueMin + "°C) has to be lower then maximum (" + tempValueMax + "°C)");
}
while (tempValueMin <= tempValueMax) {
OverrideTempValueListValue += tempValueMin + ";";
OverrideTempValueListText += tempValueMin + "°C;";
tempValueMin += Number(parentAdapter.config.VisStepWidthOverrideTemp);
}
}
await parentAdapter.setStateAsync("vis.OverrideTempValueListValue", { ack: true, val: OverrideTempValueListValue });
await parentAdapter.setStateAsync("vis.OverrideTempValueListText", { ack: true, val: OverrideTempValueListText });
if (parseInt(parentAdapter.config.VisMinProfilTemp) > 0 && parseInt(parentAdapter.config.VisMaxProfilTemp) > 0) {
TempValueListValue = "";
TempValueListText = "";
let tempValueMin = Number(parentAdapter.config.VisMinProfilTemp);
const tempValueMax = Number(parentAdapter.config.VisMaxProfilTemp);
if (tempValueMin < 4.5) {
parentAdapter.log.warn("profil parameter vis temperature: for homematic devices minimum value is 4.5°C, current is " + tempValueMin + "°C, please change settings in admin");
}
if (tempValueMin >= tempValueMax) {
parentAdapter.log.warn("profil parameter vis temperature: minimum (" + tempValueMin + "°C) has to be lower then maximum (" + tempValueMax + "°C)");
}
while (tempValueMin <= tempValueMax ){
TempValueListValue += tempValueMin + ";";
TempValueListText += tempValueMin + "°C;";
tempValueMin += Number(parentAdapter.config.VisStepWidthProfilTemp);
}
}
await parentAdapter.setStateAsync("vis.ProfileTempValueListValue", { ack: true, val: TempValueListValue });
await parentAdapter.setStateAsync("vis.ProfileTempValueListText", { ack: true, val: TempValueListText });
} catch (e) {
parentAdapter.log.error("exception in SetTempDecreaseModeValueLists [" + e + "]");
}
parentAdapter.log.debug("SetTempDecreaseModeValueLists done");
}
async function SetCurrentTimePeriod(room, period) {
if (room == ChoosenRoom) {
parentAdapter.log.debug("HandleStateChanges CurrentTimePeriod " + period);
if (RefreshingVis === false) {
await parentAdapter.setStateAsync("vis.RoomValues." + "CurrentTimePeriod", { ack: true, val: period});//Wenn Änderung des akuellen Zeitslots im aktuell gewählten Raum
}
}
}
async function SetTrigger() {
parentAdapter.log.debug("Set trigger");
parentAdapter.subscribeStates("vis.ChoosenRoom");
try {
parentAdapter.subscribeStates("vis.RoomValues.MinimumTemperature");
parentAdapter.subscribeStates("vis.RoomValues.TemperaturOverride");
parentAdapter.subscribeStates("vis.RoomValues.TemperaturOverrideTime");
parentAdapter.subscribeStates("vis.TempDecreaseValues.AbsentDecrease");
parentAdapter.subscribeStates("vis.TempDecreaseValues.GuestIncrease");
parentAdapter.subscribeStates("vis.TempDecreaseValues.PartyDecrease");
parentAdapter.subscribeStates("vis.TempDecreaseValues.VacationAbsentDecrease");
parentAdapter.subscribeStates("vis.TempDecreaseValues.WindowOpenDecrease");
if (parentAdapter.config.UseFireplaceMode) {
parentAdapter.subscribeStates("vis.TempDecreaseValues.FireplaceModeDecrease");
}
switch (ProfileType) { //Trigger für Vis Zeit und Temperatur je nach Profiltyp
default:
parentAdapter.log.error("unknown profile type " + ProfileType);
break;
case "Mo - Su": //Version1 Alle Tage zusammen
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfPeriods); x++) {
parentAdapter.subscribeStates("vis.ProfileTypes.Mo-Su.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Mo-Su.Periods." + x + ".time");
}
break;
case "Mo - Fr / Sa - Su": //Version2
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfPeriods); x++) {
parentAdapter.subscribeStates("vis.ProfileTypes.Mo-Fr.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Mo-Fr.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Sa-Su.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Sa-Su.Periods." + x + ".time");
}
break;
case "every Day": //Version3
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfPeriods); x++) {
parentAdapter.subscribeStates("vis.ProfileTypes.Mon.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Mon.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Tue.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Tue.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Wed.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Wed.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Thu.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Thu.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Fri.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Fri.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Sat.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Sat.Periods." + x + ".time");
parentAdapter.subscribeStates("vis.ProfileTypes.Sun.Periods." + x + ".Temperature");
parentAdapter.subscribeStates("vis.ProfileTypes.Sun.Periods." + x + ".time");
}
break;
}
} catch (e) {
parentAdapter.log.error("exception in SetTrigger [" + e + "]");
}
parentAdapter.log.debug("Set trigger done");
}
async function SetVis() { // Vis Daten durch Adapterdaten ersetzen bei Umschaltung Raum oder Profil
parentAdapter.log.debug("SetVis called");
try {
RefreshingVis = true; //Um zu vermeiden dass es ne Schleife gibt wo die Vis Aktualisierung bei Raumwechsel als Änderung gewertet wird
let temp;
switch (ProfileType) { //Profiltyp abhängige Zeit und Temperaturwerte setzen
default:
parentAdapter.log.error("SetVis: unknown profile type " + ProfileType);
break;
case "Mo - Su":
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfPeriods); x++) {
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Mo-Su.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Mo-Su.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Mo-Su.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Mo-Su.Periods." + x + ".time", { ack: true, val: temp.val });
}
break;
case "Mo - Fr / Sa - Su":
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfPeriods); x++) {
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Mo-Fr.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Mo-Fr.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Mo-Fr.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Mo-Fr.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Sa-Su.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Sa-Su.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Sa-Su.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Sa-Su.Periods." + x + ".time", { ack: true, val: temp.val });
}
break;
case "every Day":
for (let x = 1; x <= parseInt(parentAdapter.config.NumberOfPeriods); x++) {
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Mon.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Mon.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Mon.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Mon.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Tue.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Tue.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Tue.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Tue.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Wed.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Wed.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Wed.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Wed.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Thu.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Thu.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Thu.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Thu.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Fri.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Fri.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Fri.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Fri.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Sat.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Sat.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Sat.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Sat.Periods." + x + ".time", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Sun.Periods." + x + ".Temperature");
await parentAdapter.setStateAsync("vis.ProfileTypes.Sun.Periods." + x + ".Temperature", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + "Sun.Periods." + x + ".time");
await parentAdapter.setStateAsync("vis.ProfileTypes.Sun.Periods." + x + ".time", { ack: true, val: temp.val });
}
break;
}
//DecreaseMode Werte setzen
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + "AbsentDecrease");
await parentAdapter.setStateAsync("vis.TempDecreaseValues." + "AbsentDecrease", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + "GuestIncrease");
await parentAdapter.setStateAsync("vis.TempDecreaseValues." + "GuestIncrease", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + "PartyDecrease");
await parentAdapter.setStateAsync("vis.TempDecreaseValues." + "PartyDecrease", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + "VacationAbsentDecrease");
await parentAdapter.setStateAsync("vis.TempDecreaseValues." + "VacationAbsentDecrease", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + "WindowOpenDecrease");
await parentAdapter.setStateAsync("vis.TempDecreaseValues." + "WindowOpenDecrease", { ack: true, val: temp.val });
if (parentAdapter.config.UseFireplaceMode) {
temp = await parentAdapter.getStateAsync("Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + "FireplaceModeDecrease");
await parentAdapter.setStateAsync("vis.TempDecreaseValues." + "FireplaceModeDecrease", { ack: true, val: temp.val });
}
//Raum Werte setzen
if (parentAdapter.config.UseMinTempPerRoom) {
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "MinimumTemperature");
await parentAdapter.setStateAsync("vis.RoomValues.MinimumTemperature", { ack: true, val: temp.val });
} else {
await parentAdapter.setStateAsync("vis.RoomValues.MinimumTemperature", { ack: true, val: 0 });
parentAdapter.log.debug("MinimumTemp skipping entry and showing 0");
}
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "TemperaturOverride");
await parentAdapter.setStateAsync("vis.RoomValues.TemperaturOverride", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "TemperaturOverrideTime");
await parentAdapter.setStateAsync("vis.RoomValues.TemperaturOverrideTime", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "WindowIsOpen");
await parentAdapter.setStateAsync("vis.RoomValues.WindowIsOpen", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "StatusLog");
await parentAdapter.setStateAsync("vis.RoomValues.StatusLog", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "TemperaturOverrideRemainingTime");
await parentAdapter.setStateAsync("vis.RoomValues.TemperaturOverrideRemainingTime", { ack: true, val: temp.val });
temp = await parentAdapter.getStateAsync("Rooms." + ChoosenRoom + "." + "CurrentTimePeriod");
await parentAdapter.setStateAsync("vis.RoomValues.CurrentTimePeriod", { ack: true, val: temp.val });
await setIsActive(ChoosenRoom);
RefreshingVis = false;
} catch (e) {
parentAdapter.log.error("exception in SetVis [" + e + "]");
}
parentAdapter.log.debug("SetVis done");
}
//==========================================================================================================================
async function SetStatuslog(room, status) {
if (ChoosenRoom.length > 0 && room == ChoosenRoom) {
const id = "vis.RoomValues.StatusLog";
await parentAdapter.setStateAsync(id, { ack: true, val: status });
}
}
async function SetTemperaturOverrideRemainingTime(room, value) {
if (ChoosenRoom.length > 0 && room == ChoosenRoom) {
const id = "vis.RoomValues.TemperaturOverrideRemainingTime";
await parentAdapter.setStateAsync(id, { ack: true, val: value });
}
}
//==========================================================================================================================
async function SetTimeTempValue(ProfileDays, What, ScriptDpVal, Period) { //Werte vom Vis, Bereich Zeit/Temperatur, in AdapterDPs schreiben
if (RefreshingVis === false) {
parentAdapter.log.debug( typeof (ScriptDpVal));
//const CurrentProfile = await GetCurrentProfile();
const id = "Profiles." + CurrentProfile + "." + ChoosenRoom + "." + ProfileDays + ".Periods." + Period + "." + What;
parentAdapter.log.debug( "SetTimeTempValue: " + id + " set to " + ScriptDpVal);
//kein ack, sonst wird es nicht direkt übernommen
await parentAdapter.setStateAsync(id, { ack: false, val: ScriptDpVal });
}
}
//==========================================================================================================================
async function SetDecreaseValue(What, ScriptDpVal) {//Werte vom Vis, Bereich Absenkungen, in AdapterDPs schreiben
if (RefreshingVis === false) {
//const CurrentProfile = await GetCurrentProfile();
const id = "Profiles." + CurrentProfile + "." + ChoosenRoom + "." + TempDecreaseMode + "." + What;
parentAdapter.log.debug("SetDecreaseValue: " + id + " set to " + ScriptDpVal);
//kein ack, sonst wird es nicht direkt übernommen
await parentAdapter.setStateAsync(id, { ack: false, val: ScriptDpVal });
}
}
//==========================================================================================================================
async function SetRoomValue(What, ScriptDpVal) {
if (RefreshingVis === false) {
// this.log("Reaching SetRoomValue");
const id = "Rooms." + ChoosenRoom + "." + What;
parentAdapter.log.debug("SetRoomValue: " + id + " set to " + ScriptDpVal);
//kein ack, sonst wird es nicht direkt übernommen
await parentAdapter.setStateAsync(id, { ack: false, val: ScriptDpVal });
}
}
async function SetStateChangeVis(id, state) {
parentAdapter.log.debug("SetStateChangeVis " + id + " " + state);
}
//==========================================================================================================================
async function HandleStateChangeVis(id, state) {
let bRet = true;
//parentAdapter.log.debug("HandleStateChanges vis " + id + " with " + state.val + " refreshVis " + RefreshingVis);
try {
if (parentAdapter.config.UseVisFromPittini) {
const ids = id.split(".");
//heatingcontrol.0.Profiles.1.ProfileName
if (ids[4] == "ProfileName") {
await SetProfileValueList();
} else if (ids[2] == "CurrentProfile") {
//HandleStateChangeVis not handled heatingcontrol.0.CurrentProfile
parentAdapter.log.debug("HandleStateChanges Currentprofile " + state.val);
await SetVis();
} else if (ids[3] == "ChoosenRoom") {
//heatingcontrol.0.vis.ChoosenRoom
OldChoosenRoom = ChoosenRoom;
ChoosenRoom = state.val;
parentAdapter.log.debug("HandleStateChanges ChoosenRoom; old " + OldChoosenRoom + " new " + ChoosenRoom);
await SetVis();
//await CreateCurrentTimePeriodTrigger(); // wieder ein olvalue //Sonderfall - Um die aktuelle Periode anzeigen zu können muss ein wechselnder Trigger auf den aktuellen Raum im HC Rooms Zweig gesetzt und bei wechsel wieder gelöscht werden
} else if (ids[3] == "isActive") {
await changeIsActive(state.val);
parentAdapter.log.debug("HandleStateChanges isActive to " + state.val);
} else if (ids[3] === "ProfileTypes") {
//HeatingControl.0.vis.ProfileTypes.Mon.Periods.0.Temperature
if (ids[7] === "time") {
parentAdapter.log.debug("HandleStateChanges time " + ids[4] + " " + state.val + " " + ids[6]);
if (RefreshingVis === false) {
await SetTimeTempValue(ids[4], "time", state.val, ids[6]);
}
} else if (ids[7] === "Temperature") {
parentAdapter.log.debug("HandleStateChanges Temperature " + ids[4] + " " + state.val + " " + ids[6]);
if (RefreshingVis === false) {
await SetTimeTempValue(ids[4], "Temperature", state.val, ids[6]);
}
}
} else if (ids[3] === "TempDecreaseValues") {
parentAdapter.log.debug("HandleStateChanges TempDecreaseValues " + " with " + state.val);
if (ids[4] === "AbsentDecrease") {
if (RefreshingVis === false) {
await SetDecreaseValue("AbsentDecrease", state.val);
}
} else if (ids[4] === "GuestIncrease") {
if (RefreshingVis === false) {
await SetDecreaseValue("GuestIncrease", state.val);
}
} else if (ids[4] === "PartyDecrease") {
if (RefreshingVis === false) {
await SetDecreaseValue("PartyDecrease", state.val);
}
} else if (ids[4] === "VacationAbsentDecrease") {
if (RefreshingVis === false) {
await SetDecreaseValue("VacationAbsentDecrease", state.val);
}
} else if (ids[4] === "WindowOpenDecrease") {
if (RefreshingVis === false) {
await SetDecreaseValue("WindowOpenDecrease", state.val);
}
} else if (ids[4] === "FireplaceModeDecrease") {
if (RefreshingVis === false) {
await SetDecreaseValue("FireplaceModeDecrease", state.val);
}
}
} else if (ids[3] === "RoomValues") {
parentAdapter.log.debug("HandleStateChanges RoomValues " + id + " " + state.val);
if (ids[4] === "MinimumTemperature") {
parentAdapter.log.debug("HandleStateChanges MinimumTemperature ");
if (RefreshingVis === false) {
await SetRoomValue("MinimumTemperature", state.val);
}
} else if (ids[4] === "TemperaturOverride") {
parentAdapter.log.debug("HandleStateChanges TemperaturOverride ");
if (RefreshingVis === false) {
await SetRoomValue("TemperaturOverride", state.val);
}
} else if (ids[4] === "TemperaturOverrideTime") {
parentAdapter.log.debug("HandleStateChanges TemperaturOverrideTime ");
if (RefreshingVis === false) {
await SetRoomValue("TemperaturOverrideTime", state.val);
}
}
} else {
parentAdapter.log.error("HandleStateChangeVis not handled " + id);
bRet = false;
}
}
} catch (e) {
parentAdapter.log.error("exception in HandleStateChangeVis [" + e + "]");
}
return bRet;
}
module.exports = {
StartVis,
SetCurrentProfile,
SetCurrentTimePeriod,
SetStatuslog,
SetTemperaturOverrideRemainingTime,
HandleStateChangeVis,
SetStateChangeVis,
SetVis
};