iobroker.lg-thinq
Version:
Adapter for LG ThinQ
1,033 lines (1,030 loc) • 52.7 kB
JavaScript
const new_holiday_start = {
type: 2,
onOffFlag: 0,
startYear: 255,
startMonth: 255,
startDate: 255,
startHour: 255,
startMin: 255,
power: 0,
opMode: 3,
tempCfg: 17,
hotWater: 0,
};
const new_holiday_end = {
type: 2,
onOffFlag: 0,
endYear: 255,
endMonth: 255,
endDate: 255,
endHour: 255,
endMin: 255,
power: 0,
opMode: 3,
tempCfg: 17,
hotWater: 0,
};
const new_silentMode = {
type: 3,
onOffFlag: 0,
startHour: 17,
startMin: 17,
endHour: 19,
endMin: 17,
silentMode: 1,
};
const addRemote = [
"airState.tempState.hotWaterTarget",
"airState.2nd.tempState.target",
"airState.2nd.operation",
"airState.miscFuncState.hotWater",
"airState.miscFuncState.powerHotWater",
];
module.exports = {
async createAirRemoteStates(device, deviceModel) {
if (!deviceModel || !deviceModel.ControlDevice) {
this.log.info("createAirRemoteStates: Cannot found ControlDevice");
}
let langPack = null;
if (device.langPackProductTypeUri) {
langPack = await this.requestClient
.get(device.langPackProductTypeUri)
.then(res => res.data)
.catch(error => {
this.log.info(`langPackProductTypeUri: ${error}`);
return null;
});
if (langPack && langPack.pack) {
langPack = langPack.pack;
} else {
langPack = null;
}
}
this.log.debug(JSON.stringify(langPack));
const control = JSON.stringify(deviceModel.ControlDevice);
let valueDefault = null;
let isAdd = false;
let foldername = "";
if (device.snapshot) {
for (const remote in device.snapshot) {
isAdd = false;
if (control.includes(remote) || addRemote.includes(remote)) {
if (!control.includes(remote)) {
isAdd = true;
}
for (const dataRemote of deviceModel.ControlDevice) {
let common = {};
if (JSON.stringify(dataRemote).includes(remote) || isAdd) {
const laststate = remote.split(".").pop();
if (isAdd) {
if (remote === "airState.2nd.operation" || remote === "airState.2nd.tempState.target") {
foldername = "2nd";
} else {
foldername = "basicCtrl";
}
} else {
foldername = dataRemote.ctrlKey;
}
if (
dataRemote.dataKey ||
(dataRemote.dataSetList && (laststate == "jet" || laststate == "airClean")) ||
isAdd
) {
await this.setObjectNotExistsAsync(`${device.deviceId}.remote.${foldername}`, {
type: "channel",
common: {
name: foldername,
desc: "Create by LG-Thinq Adapter",
},
native: {},
});
const obj = await this.getObjectAsync(
`${device.deviceId}.remote.${foldername}.${laststate}`,
);
common = {
name: remote,
type: "mixed",
role: "state",
write: true,
read: true,
};
if (obj) {
common = obj.common;
}
const commons = {};
let valueObject = {};
valueDefault = deviceModel["Value"][remote]["default"]
? deviceModel["Value"][remote]["default"]
: null;
if (deviceModel["Value"][remote]["value_mapping"]) {
valueObject = deviceModel["Value"][remote]["value_mapping"];
}
if (deviceModel["Value"][remote]["value_validation"]) {
valueObject = deviceModel["Value"][remote]["value_validation"];
}
if (valueObject) {
if (valueObject.max) {
if (laststate === "target") {
valueObject.max = 40;
} else if (laststate === "limitMax") {
valueObject.max = 70;
} else if (laststate === "limitMin") {
valueObject.max = 40;
}
common.min = 0;
common.max = laststate == "odor" ? 2000000 : valueObject.max;
common.def = valueDefault ? parseFloat(valueDefault) : 0;
common.type = "number";
common.role = "value";
} else {
const values = Object.keys(valueObject);
for (const value of values) {
const content = valueObject[value];
if (typeof content === "string") {
commons[value] =
langPack && langPack[content]
? langPack[content].toString("utf-8")
: content.replace("@", "");
}
}
common.role = "state";
}
}
if (Object.keys(commons).length > 0) {
if (common["states"] != null) {
delete common.states;
}
common.states = commons;
}
if (!obj) {
await this.createDataPoint(
`${device.deviceId}.remote.${foldername}.${laststate}`,
common,
"state",
{ dataKey: remote },
);
} else {
obj.common = common;
obj.native = { dataKey: remote };
await this.setObjectAsync(
`${device.deviceId}.remote.${foldername}.${laststate}`,
obj,
);
}
this.available401[`${device.deviceId}.remote.${foldername}.${laststate}`] = true;
this.log.debug(`Snapshot: ${device.deviceId}.remote.${foldername}.${laststate}`);
} else if (dataRemote.dataSetList) {
//wModeCtrl
//reservationCtrl
//favoriteCtrl
//filterMngStateCtrl
//energyDesiredCtrl
}
}
if (isAdd) {
break;
}
}
}
}
}
await this.setObjectNotExistsAsync(`${device.deviceId}.remote.sendJSON`, {
type: "state",
common: {
name: "sendJSON",
type: "string",
write: true,
read: true,
role: "json",
desc: "sendJSON",
def: "",
},
native: {},
});
//create manual allEventEnable, reservationCtrl
let commons = {};
const manuell = [
[
"allEventEnable",
"airState.mon.timeout",
"allEventEnable.timeout",
{
name: "airState.mon.timeout",
type: "number",
role: "value",
write: true,
read: true,
min: 0,
max: 1440,
def: 0,
},
],
[
"break",
"holiday",
"break.holiday_silent_update",
{
name: "Read data holiday & silent",
type: "boolean",
role: "button",
write: true,
read: true,
def: false,
},
],
[
"break",
"holiday",
"break.holiday_sendJSON",
{
name: "Holiday & Silent send your JSON",
type: "boolean",
role: "button",
write: true,
read: true,
def: false,
},
],
[
"break",
"holiday",
"break.holiday_onoff",
{
name: "Holiday On/Off",
type: "boolean",
role: "switch",
write: true,
read: true,
def: false,
},
],
[
"break",
"holiday",
"break.holiday_silent_data",
{
name: "Holiday JSON",
type: "string",
role: "json",
write: true,
read: true,
},
],
[
"break",
"holiday",
"break.holiday_startdate",
{
name: "Holiday start DD.MM.YY HH:MM",
type: "string",
role: "value.date",
write: true,
read: true,
},
],
[
"break",
"holiday",
"break.holiday_enddate",
{
name: "Holiday end DD.MM.YY HH:MM",
type: "string",
role: "value.date",
write: true,
read: true,
},
],
[
"break",
"holiday",
"break.holiday_heating",
{
name: "Holiday heating on/off",
type: "boolean",
role: "switch",
write: true,
read: true,
def: false,
},
],
[
"break",
"holiday",
"break.holiday_water",
{
name: "Holiday water on/off",
type: "boolean",
role: "switch",
write: true,
read: true,
def: false,
},
],
[
"break",
"holiday",
"break.silent_mode_starttime",
{
name: "Silent-Mode start HH:MM",
type: "string",
role: "value.date",
write: true,
read: true,
},
],
[
"break",
"holiday",
"break.silent_mode_endtime",
{
name: "Silent-Mode end HH:MM",
type: "string",
role: "value.date",
write: true,
read: true,
},
],
[
"break",
"holiday",
"break.silent_mode_onoff",
{
name: "Silent-Mode On/Off",
type: "boolean",
role: "switch",
write: true,
read: true,
def: false,
},
],
];
for (const device_data of manuell) {
commons = device_data[3];
await this.setObjectNotExistsAsync(`${device.deviceId}.remote.${device_data[0]}`, {
type: "channel",
common: {
name: device_data[0],
role: "state",
},
native: {},
});
const obj = await this.getObjectAsync(`${device.deviceId}.remote.${device_data[2]}`);
if (!obj) {
await this.createDataPoint(`${device.deviceId}.remote.${device_data[2]}`, commons, "state", {
dataKey: device_data[1],
});
} else {
delete obj["common"];
obj["common"] = commons;
obj["native"] = { dataKey: device_data[1] };
await this.setObjectAsync(`${device.deviceId}.remote.${device_data[2]}`, obj);
}
}
},
async updateHoliday(device, devType, id, state) {
const laststate = id.split(".").pop();
let countValue = 0;
let next_type = 0;
let first_type_2 = true;
let obj = null;
let is_holiday_available = false;
let is_silent_available = false;
const data = {
ctrlKey: "reservationCtrl",
command: "Get",
dataKey: null,
dataValue: null,
dataSetList: null,
dataGetList: ["airState.reservation.advancedSchedule"],
};
try {
let valJSON;
let editJSON;
let datapoint = "";
switch (laststate) {
case "holiday_silent_update":
obj = await this.sendCommandToDevice(device, data);
if (obj && obj.result && obj.result.data) {
obj.result.data["airState.reservation.advancedSchedule"].sort((a, b) => {
if (a.type < b.type) {
return -1;
}
});
await this.setState(`${device}.remote.break.holiday_silent_data`, {
val: JSON.stringify(obj.result.data),
ack: true,
});
let date_DP = "";
if (obj.result.data["airState.reservation.advancedSchedule"]) {
const lastValue = Object.keys(
obj.result.data["airState.reservation.advancedSchedule"],
).length;
for (const element of obj.result.data["airState.reservation.advancedSchedule"]) {
++countValue;
if (countValue < lastValue) {
next_type =
obj.result.data["airState.reservation.advancedSchedule"][countValue].type;
} else {
next_type = element.type;
}
this.log.debug(next_type);
if (element.type != null && element.onOffFlag != null) {
if (element.type === 2 && countValue != lastValue && first_type_2) {
first_type_2 = false;
is_holiday_available = true;
date_DP =
element["startDate"].toString().length == 1
? `0${element.startDate}`
: `${element.startDate}.`;
date_DP +=
element["startMonth"].toString().length == 1
? `0${element.startMonth}`
: `${element.startMonth}.`;
date_DP += `${element.startYear} `;
date_DP +=
element["startHour"].toString().length == 1
? `0${element.startHour}`
: `${element.startHour}:`;
date_DP +=
element["startMin"].toString().length == 1
? `0${element.startMin}`
: element.startMin;
await this.setState(`${device}.remote.break.holiday_heating`, {
val: element.power ? true : false,
ack: true,
});
await this.setState(`${device}.remote.break.holiday_water`, {
val: element.hotWater ? true : false,
ack: true,
});
await this.setState(`${device}.remote.break.holiday_startdate`, {
val: date_DP,
ack: true,
});
} else if (element.type === 2 && (countValue === lastValue || next_type === 3)) {
is_holiday_available = true;
date_DP =
element["endDate"].toString().length == 1
? `0${element.endDate}`
: `${element.endDate}.`;
date_DP +=
element["endMonth"].toString().length == 1
? `0${element.endMonth}`
: `${element.endMonth}.`;
date_DP += `${element.endYear} `;
date_DP +=
element["endHour"].toString().length == 1
? `0${element.endHour}`
: `${element.endHour}:`;
date_DP +=
element["endMin"].toString().length == 1
? `0${element.endMin}`
: element.endMin;
await this.setState(`${device}.remote.break.holiday_enddate`, {
val: date_DP,
ack: true,
});
await this.setState(`${device}.remote.break.holiday_onoff`, {
val: element.onOffFlag === 1 ? true : false,
ack: true,
});
} else if (element.type === 3) {
is_silent_available = true;
date_DP =
element["startHour"].toString().length == 1
? `0${element.startHour}`
: `${element.startHour}:`;
date_DP +=
element["startMin"].toString().length == 1
? `0${element.startMin}`
: element.startMin;
await this.setState(`${device}.remote.break.silent_mode_starttime`, {
val: date_DP,
ack: true,
});
date_DP =
element["endHour"].toString().length == 1
? `0${element.endHour}`
: `${element.endHour}:`;
date_DP +=
element["endMin"].toString().length == 1
? `0${element.endMin}`
: element.endMin;
await this.setState(`${device}.remote.break.silent_mode_endtime`, {
val: date_DP,
ack: true,
});
await this.setState(`${device}.remote.break.silent_mode_onoff`, {
val: element.onOffFlag === 1 ? true : false,
ack: true,
});
}
} else {
this.log.info("Cannot find advancedSchedule!");
}
}
if (is_holiday_available === false) {
obj.result.data["airState.reservation.advancedSchedule"].push(new_holiday_start);
obj.result.data["airState.reservation.advancedSchedule"].push(new_holiday_end);
this.log.info("Push advancedSchedule holiday");
}
if (is_silent_available === false) {
obj.result.data["airState.reservation.advancedSchedule"].push(new_silentMode);
this.log.info("Push advancedSchedule silent mode");
}
if (is_holiday_available === false || is_silent_available === false) {
data.command = "Set";
data.dataSetList = obj.result.data;
// @ts-expect-error nothing
data.dataGetList = null;
this.log.info(`send obj: ${JSON.stringify(data)}`);
obj = await this.sendCommandToDevice(device, data);
this.log.info(`create obj: ${JSON.stringify(obj)}`);
if (obj != null && obj.resultCode != null && obj.resultCode == "0000") {
this.log.warn(
"Holiday/Silent Mode time maybe created. Please press holiday_silent_update again!",
);
} else {
this.log.info("Cannot created advancedSchedule!");
}
}
} else {
this.log.info("Cannot find advancedSchedule");
}
}
break;
case "holiday_enddate":
break;
case "holiday_startdate":
break;
case "holiday_heating":
break;
case "holiday_water":
break;
case "holiday_silent_data":
break;
case "silent_mode_starttime":
break;
case "silent_mode_endtime":
break;
case "silent_mode_onoff":
valJSON = await this.getStateAsync(`${device}.remote.break.holiday_silent_data`);
if (!valJSON || valJSON.val == null || valJSON.val == "") {
this.log.info("Cannot find advancedSchedule!");
break;
}
editJSON = JSON.parse(valJSON.val);
if (!editJSON["airState.reservation.advancedSchedule"]) {
this.log.info("Missing advancedSchedule!");
break;
}
if (editJSON) {
const allValue = Object.keys(editJSON["airState.reservation.advancedSchedule"]).length;
if (allValue > 0) {
const index = editJSON["airState.reservation.advancedSchedule"].findIndex(
index => index.type === 3,
);
editJSON["airState.reservation.advancedSchedule"][index].onOffFlag = state.val ? 1 : 0;
if (editJSON["airState.reservation.advancedSchedule"][index].startHour === 255) {
editJSON["airState.reservation.advancedSchedule"][index].onOffFlag = 18;
}
if (editJSON["airState.reservation.advancedSchedule"][index].endHour === 255) {
editJSON["airState.reservation.advancedSchedule"][index].onOffFlag = 6;
}
this.log.debug(`editJSON: ${JSON.stringify(editJSON)}`);
data.command = "Set";
data.dataSetList = editJSON;
// @ts-expect-error nothing
data.dataGetList = null;
obj = await this.sendCommandToDevice(device, data);
this.log.debug(`obj: ${JSON.stringify(obj)}`);
if (obj != null && obj.resultCode != null && obj.resultCode == "0000") {
this.log.info("Silent Mode time is activated.");
} else {
this.log.info("Cannot update advancedSchedule!");
}
}
}
break;
case "holiday_onoff":
valJSON = await this.getStateAsync(`${device}.remote.break.holiday_silent_data`);
if (!valJSON || valJSON.val == null || valJSON.val == "") {
this.log.info("Cannot find advancedSchedule!");
break;
}
editJSON = JSON.parse(valJSON.val);
if (!editJSON["airState.reservation.advancedSchedule"]) {
this.log.info("Missing advancedSchedule!");
break;
}
datapoint = "holiday_startdate";
if (state.val) {
const allValue = Object.keys(editJSON["airState.reservation.advancedSchedule"]).length;
if (allValue === 0) {
this.log.info("The holiday JSON is empty!");
break;
} else if (allValue > 4 && allValue === 5) {
next_type = editJSON["airState.reservation.advancedSchedule"][allValue - 1].type;
if (next_type != 3) {
this.log.info("Cannot create a holiday JSON! Use direct DP holiday_sendJSON!");
break;
}
} else if (allValue > 5) {
this.log.info("Cannot create a holiday JSON!! Use direct DP holiday_sendJSON!");
break;
}
if (laststate != "holiday_onoff") {
datapoint = "silent_mode_starttime";
}
const startD = await this.getStateAsync(`${device}.remote.break.${datapoint}`);
if (!startD || startD.val == null || startD.val == "") {
this.log.info("Cannot find startdate!");
break;
}
if (datapoint == "silent_mode_starttime") {
startD.val = `01.01.21 ${startD.val}`;
}
const startDate = await this.checkHolidayDate(startD.val, laststate);
if (!startDate) {
break;
}
datapoint = "holiday_enddate";
if (laststate != "holiday_onoff") {
datapoint = "silent_mode_endtime";
}
const endD = await this.getStateAsync(`${device}.remote.break.${datapoint}`);
if (!endD || endD.val == null || endD.val == "") {
this.log.info("Cannot find enddate!");
break;
}
if (datapoint == "silent_mode_endtime") {
endD.val = `01.01.21 ${endD.val}`;
}
const endDate = await this.checkHolidayDate(endD.val, laststate);
if (!endDate) {
break;
}
if (endDate[5] - startDate[5] < 0) {
this.log.info("Enddate is less than the startdate!");
break;
}
const heating = await this.getStateAsync(`${device}.remote.break.holiday_heating`);
const firstValue = {};
for (const element of editJSON["airState.reservation.advancedSchedule"]) {
++countValue;
if (countValue < allValue) {
next_type = editJSON["airState.reservation.advancedSchedule"][countValue].type;
} else {
next_type = element.type;
}
this.log.debug(next_type);
if (element.type != null && element.type === 1 && countValue === 1) {
firstValue["power"] = element.power;
firstValue["hotWater"] = element.hotWater;
} else if (
first_type_2 &&
laststate == "holiday_onoff" &&
element.type != null &&
element.type === 2 &&
countValue !== allValue
) {
first_type_2 = false;
element.onOffFlag = 1;
element.startDate = startDate[0];
element.startMonth = startDate[1];
element.startYear = startDate[2];
element.startHour = startDate[3];
element.startMin = startDate[4];
element.power = heating.val === true ? 1 : 0;
element.hotWater = heating.val === true ? 1 : 0;
} else if (
laststate == "holiday_onoff" &&
element.type != null &&
element.type === 2 &&
(countValue === allValue || next_type === 3)
) {
element.onOffFlag = 1;
element.startDate = 255;
element.startMonth = 255;
element.startYear = 255;
element.startHour = 255;
element.startMin = 255;
element.endDate = endDate[0];
element.endMonth = endDate[1];
element.endYear = endDate[2];
element.endHour = endDate[3];
element.endMin = endDate[4];
element.power = firstValue["power"];
element.hotWater = firstValue["hotWater"];
} else if (laststate == "silent_mode_onoff" && element.type === 3) {
element.onOffFlag = 1;
element.startHour = startDate[3];
element.startMin = startDate[4];
element.endHour = endDate[3];
element.endMin = endDate[4];
}
}
this.log.debug(`editJSON: ${JSON.stringify(editJSON)}`);
data.command = "Set";
data.dataSetList = editJSON;
// @ts-expect-error nothing
data.dataGetList = null;
obj = await this.sendCommandToDevice(device, data);
this.log.debug(`obj: ${JSON.stringify(obj)}`);
if (obj != null && obj.resultCode != null && obj.resultCode == "0000") {
this.log.info("Holiday/Silent Mode time is activated.");
await this.setState(`${device}.remote.break.holiday_silent_update`, {
val: true,
ack: false,
});
} else {
this.log.info("Cannot update advancedSchedule!");
}
} else {
for (const element of editJSON["airState.reservation.advancedSchedule"]) {
if (element.type && element.type === 2 && laststate == "holiday_onoff") {
element.onOffFlag = 0;
}
if (element.type && element.type === 3 && laststate == "silent_mode_onoff") {
element.onOffFlag = 0;
}
}
this.log.debug(`editJSON: ${JSON.stringify(editJSON)}`);
data.command = "Set";
data.dataSetList = editJSON;
// @ts-expect-error nothing
data.dataGetList = null;
obj = await this.sendCommandToDevice(device, data);
this.log.debug(`obj: ${JSON.stringify(obj)}`);
if (obj != null && obj.resultCode != null && obj.resultCode == "0000") {
this.log.info("Holiday/Silent Mode time is disabled.");
await this.setState(`${device}.remote.break.holiday_silent_update`, {
val: true,
ack: false,
});
} else {
this.log.info("Cannot update advancedSchedule!");
}
}
break;
case "holiday_sendJSON":
valJSON = await this.getStateAsync(`${device}.remote.break.holiday_silent_data`);
if (!valJSON || valJSON.val == null || valJSON.val == "") {
this.log.info("Cannot find advancedSchedule!");
break;
}
editJSON = JSON.parse(valJSON.val);
if (!editJSON["airState.reservation.advancedSchedule"]) {
this.log.info("Missing advancedSchedule!");
break;
}
this.log.debug(`editJSON: ${JSON.stringify(editJSON)}`);
data.command = "Set";
data.dataSetList = editJSON;
// @ts-expect-error nothing
data.dataGetList = null;
obj = await this.sendCommandToDevice(device, data);
this.log.debug(`obj: ${JSON.stringify(obj)}`);
if (obj != null && obj.resultCode != null && obj.resultCode == "0000") {
this.log.info("Holiday/Silent Mode time is disabled.");
await this.setState(`${device}.remote.break.holiday_silent_update`, {
val: true,
ack: false,
});
} else {
this.log.info("Cannot update advancedSchedule!");
}
await this.setState(`${device}.remote.break.holiday_sendJSON`, {
val: false,
ack: true,
});
break;
default:
this.log.info("Not found switch");
return;
}
} catch (err) {
this.log.info(`updateHoliday: ${err}`);
}
},
async checkHolidayDate(datecheck, laststate) {
try {
const dateTime = datecheck.split(" ");
if (dateTime.length != 2) {
this.log.info("Cannot parse date & time!");
return false;
}
const splitTime = dateTime[1].split(":");
if (splitTime.length != 2) {
this.log.info("Cannot parse time!!");
return false;
}
const splitDate = dateTime[0].split(".");
if (splitDate.length != 3) {
this.log.info("Cannot parse date!!");
return false;
}
if (
splitDate[0].toString().length != 2 ||
splitDate[1].toString().length != 2 ||
splitDate[2].toString().length != 2 ||
splitDate[0] > 31 ||
splitDate[1] > 12 ||
splitTime[0].toString().length != 2 ||
splitTime[1].toString().length != 2 ||
splitTime[0] > 23 ||
splitTime[1] > 59
) {
this.log.info("Cannot parse startdate/starttime!!");
return false;
}
const times = new Date(
`20${splitDate[2]}-${splitDate[1]}-${splitDate[0]} ${splitTime[0]}:${splitTime[1]}:00`,
);
if (times.getTime() - Date.now() < 0 && laststate == "holiday_onoff") {
this.log.info("Date is less than the current date.");
return false;
}
return [
Number(splitDate[0]),
Number(splitDate[1]),
Number(splitDate[2]),
Number(splitTime[0]),
Number(splitTime[1]),
times.getTime(),
];
} catch (err) {
this.log.info(`checkHolidayDate: ${err}`);
return false;
}
},
async createAirRemoteThinq1States(device, deviceModel, constants) {
if (!deviceModel) {
this.log.info("createAirRemoteThinq1States: Cannot found ControlDevice");
return;
}
let langPack = null;
if (device.langPackProductTypeUri) {
langPack = await this.requestClient
.get(device.langPackProductTypeUri)
.then(res => res.data)
.catch(error => {
this.log.info(`langPackProductTypeUri: ${error}`);
return null;
});
if (langPack && langPack.pack) {
langPack = langPack.pack;
} else {
langPack = null;
}
}
this.log.debug(`LangPack: ${JSON.stringify(langPack)}`);
const monitoring =
deviceModel.Monitoring && deviceModel.Monitoring.protocol ? deviceModel.Monitoring.protocol : null;
const path = `${device.deviceId}.remote.settings.`;
const path_remote = `${device.deviceId}.remote.`;
if (monitoring != null) {
for (const val of monitoring) {
const state = val.value;
this.log.debug(path + state);
if (deviceModel["Value"][state]) {
if (
deviceModel.ControlWifi &&
deviceModel.ControlWifi.action &&
deviceModel.ControlWifi.action[`Set${state}`]
) {
await this.setObjectNotExistsAsync(`${path_remote}Set${state}`, {
type: "state",
common: {
name: deviceModel.ControlWifi.action[`Set${state}`].value || state,
type: "boolean",
role: "button",
desc: "Create by LG-Thinq Adapter",
def: false,
write: true,
read: true,
},
native: {},
}).catch(error => {
this.log.error(error);
});
}
const obj = await this.getObjectAsync(path + state);
const common = {
name: state,
type: "mixed",
role: "state",
write: true,
read: true,
};
const commons = {};
const valueObject = deviceModel["Value"][state]["option"]
? deviceModel["Value"][state]["option"]
: null;
const valueDefault = deviceModel["Value"][state]["default"]
? deviceModel["Value"][state]["default"]
: null;
if (valueObject) {
if (valueObject.max) {
common.min = 0;
if (state === "moreLessTime") {
common.max = 200;
} else if (state === "timeSetting") {
common.max = 360;
} else {
if (valueDefault != null && valueDefault > valueObject.max) {
common.max = valueDefault;
} else {
common.max = valueObject.max;
}
}
} else {
const values = Object.keys(valueObject);
for (const value of values) {
const content = valueObject[value];
if (typeof content === "string") {
const new_content = content.replace("@", "");
if (langPack != null && langPack[content]) {
commons[value] = langPack[content].toString("utf-8");
} else if (constants[`${this.lang}Translation`][new_content] != null) {
commons[value] = constants[`${this.lang}Translation`][new_content];
} else {
commons[value] = new_content;
}
}
}
}
common.def = valueDefault ? parseFloat(valueDefault) : 0;
common.type = "number";
if (Object.keys(commons).length > 0) {
if (common["states"] != null) {
delete common.states;
}
common.states = commons;
}
if (common.write == null) {
common.write = true;
}
if (common.read == null) {
common.read = true;
}
if (!obj) {
await this.setObjectNotExistsAsync(path + state, {
type: "state",
common: common,
native: {},
}).catch(error => {
this.log.error(error);
});
} else {
obj.common = common;
await this.setObjectAsync(path + state, obj);
}
}
}
}
}
},
async sendCommandThinq1AC(id, deviceID, data, action) {
const rawData = Object.assign({}, data);
const dp_value = async (dp, single) => {
if (single) {
const val = await this.getStateAsync(dp);
this.log.debug(`Val: ${JSON.stringify(val)}`);
return val.val;
}
try {
this.log.debug(`RAW: ${dp}`);
const json_value = JSON.parse(dp);
this.log.debug(`RAW_JSON: ${JSON.stringify(json_value)}`);
const new_json = {};
for (const js in json_value) {
const value = await this.getStateAsync(`${deviceID}.remote.settings.${js}`);
this.log.debug(`Value: ${JSON.stringify(value)}`);
if (value) {
new_json[js] = value.val;
} else {
new_json[js] = json_value[js];
}
}
return new_json;
} catch (e) {
this.log.info(`sendCommandThinq1AC: ${e}`);
return null;
}
};
if (action === "SetOperation") {
//rawData.value = await dp_value(`${deviceID}.remote.settings.Operation`, true);
rawData.value = await dp_value(`${deviceID}.remote.settings.Operation`, true);
} else if (action === "SetEnergyDesiredValue") {
rawData.value = null;
//"value": "{\"Schedule\" : \" { \"Day\":\"{EnergyDesiredValueDay}\",\"Week\":\"{EnergyDesiredValueWeek}\",\"Month\":\"{EnergyDesiredValueMonth}\" } \" } ",
} else if (action === "SetRecommendWind") {
rawData.value = null;
//"value": "{\"AirCapsule\" : \"{ \"OpMode\":\"{{OpMode}}\",\"TempCfg\":\"{{TempCfg}}\"}",
} else if (action === "SetFilterUse") {
rawData.value = "Filter";
} else if (action === "Camera_Start" || action === "Camera_Start") {
rawData.value = null;
} else if (action === "Indirect_Wind_ON") {
rawData.value = "Indirect_Wind_ON";