iobroker.myenergi
Version:
Adapter for Myenergi devices
332 lines (331 loc) • 12.7 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var json2iob_exports = {};
__export(json2iob_exports, {
default: () => Json2iob
});
module.exports = __toCommonJS(json2iob_exports);
var import_json_bigint = __toESM(require("json-bigint"));
({ storeAsString: true });
class Json2iob {
constructor(adapter) {
this.description = {
sno: "serial no",
dat: "Date",
tim: "Time",
ectp1: " Physical CT connection 1 value Watts",
ectp2: " Physical CT connection 2 value Watts",
ectp3: " Physical CT connection 3 value Watts",
ectp4: " Physical CT connection 4 value Watts",
ectp5: " Physical CT connection 5 value Watts",
ectp6: " Physical CT connection 6 value Watts",
ectt1: "CT 1 Name",
ectt2: "CT 2 Name",
ectt3: "CT 3 Name",
ect1p: " CT 1 Phase",
ect2p: " CT 2 Phase",
ect3p: " CT 3 Phase",
fwv: "Firmware version",
bsm: "Boost Mode Manual",
che: "Latest charge session. Charge added in kWh",
cmt: "Command Timer - counts 1 - 10 when command sent, then 254 - success, 253 - failure, 255 - never received any commands",
div: "Diversion amount Watts/ Aktuelle Ladeleistung in W",
dst: "Daylight Savings Time enabled",
frq: "Supply Frequency",
gen: "Generated Watts",
grd: "Current Watts from Grid (negative if sending to grid)",
hno: "Currently active heater (1/2)",
ht1: "Heater 1 name",
ht2: "Heater 2 name",
pha: "phase number or number of phases?",
pri: "priority",
r1a: "Have never seen this ?",
r2a: "Have never seen this ?",
r2b: "Have never seen this ?",
rbt: "If boosting, the remaining boost time in of seconds",
sta: "Status 1=Paused, 3=Diverting, 4=Boost, 5=Max Temp Reached, 6=Stopped",
tp: "temperature probe 1 (50 C)",
tp2: "temperature probe 2",
vol: "Voltage out (divide by 10)",
zmo: "Zappi Charge Mode",
bss: "Boost Mode Smart",
bst: "Boost Mode Timer",
pst: "Charger Status",
lck: "Lock Status",
ts: "Timezone",
mgl: "Minimum Green Level"
};
this.adapter = adapter;
this.alreadyCreatedObjects = {};
}
async parse(path, element, options) {
try {
if (element === null || element === void 0) {
this.adapter.log.debug("Cannot extract empty: " + path);
return;
}
const objectKeys = Object.keys(element);
if (!options || !options.write) {
if (!options) {
options = { write: false };
} else {
options["write"] = false;
}
}
if (typeof element === "string" || typeof element === "number") {
let name = element;
if (typeof element === "number") {
name = element.toString();
}
if (this.description[path]) {
name = this.description[path];
}
if (!this.alreadyCreatedObjects[path]) {
await this.adapter.setObjectNotExistsAsync(path, {
type: "state",
common: {
name,
role: this.getRole(element, options.write),
type: element !== null ? typeof element : "mixed",
write: options.write,
read: true
},
native: {}
}).then(() => {
}).catch((error) => {
this.adapter.log.error(error);
});
}
this.adapter.setState(path, element, true);
return;
}
if (!this.alreadyCreatedObjects[path]) {
await this.adapter.setObjectNotExistsAsync(path, {
type: "channel",
common: {
name: options.channelName || "",
write: false,
read: true
},
native: {}
}).then(() => {
options.channelName = void 0;
}).catch((error) => {
this.adapter.log.error(error);
});
}
if (Array.isArray(element)) {
await this.extractArray(element, "", path, options);
return;
}
for (const key of objectKeys) {
if (this.isJsonString(element[key]) && options.autoCast) {
element[key] = (0, import_json_bigint.default)({ storeAsString: true }).parse(element[key]);
}
if (Array.isArray(element[key])) {
await this.extractArray(element, key, path, options);
} else if (element[key] !== null && typeof element[key] === "object") {
await this.parse(path + "." + key, element[key], options);
} else {
if (!this.alreadyCreatedObjects[path + "." + key]) {
let objectName = key;
if (options.descriptions && options.descriptions[key]) {
objectName = options.descriptions[key];
}
if (this.description[objectName]) {
objectName = this.description[objectName];
}
const type = element[key] !== null ? typeof element[key] : "mixed";
const common = {
name: objectName,
role: this.getRole(element[key], options.write),
type,
write: options.write,
read: true
};
await this.adapter.setObjectNotExistsAsync(path + "." + key, {
type: "state",
common,
native: {}
}).then(() => {
}).catch((error) => {
this.adapter.log.error(error);
});
}
this.adapter.setState(path + "." + key, element[key], true);
}
}
} catch (error) {
this.adapter.log.error("Error extract keys: " + path + " " + JSON.stringify(element));
this.adapter.log.error(error);
}
}
async extractArray(element, key, path, options) {
try {
if (key) {
element = element[key];
}
for (let index in element) {
const arrayElement = element[index];
index = parseInt(index) + 1;
if (index < 10) {
index = "0" + index;
}
let arrayPath = key + index;
if (typeof arrayElement === "string") {
await this.parse(path + "." + key + "." + arrayElement, arrayElement, options);
continue;
}
if (typeof arrayElement[Object.keys(arrayElement)[0]] === "string") {
arrayPath = arrayElement[Object.keys(arrayElement)[0]];
}
for (const keyName of Object.keys(arrayElement)) {
if (keyName.endsWith("Id") && arrayElement[keyName] !== null) {
if (arrayElement[keyName] && arrayElement[keyName].replace) {
arrayPath = arrayElement[keyName].replace(/\./g, "");
} else {
arrayPath = arrayElement[keyName];
}
}
}
for (const keyName in Object.keys(arrayElement)) {
if (keyName.endsWith("Name")) {
if (arrayElement[keyName] && arrayElement[keyName].replace) {
arrayPath = arrayElement[keyName].replace(/\./g, "");
} else {
arrayPath = arrayElement[keyName];
}
}
}
if (arrayElement.id) {
if (arrayElement.id.replace) {
arrayPath = arrayElement.id.replace(/\./g, "");
} else {
arrayPath = arrayElement.id;
}
}
if (arrayElement.name) {
arrayPath = arrayElement.name.replace(/\./g, "");
}
if (arrayElement.label) {
arrayPath = arrayElement.label.replace(/\./g, "");
}
if (arrayElement.labelText) {
arrayPath = arrayElement.labelText.replace(/\./g, "");
}
if (arrayElement.start_date_time) {
arrayPath = arrayElement.start_date_time.replace(/\./g, "");
}
if (options.preferedArrayName && options.preferedArrayName.indexOf("+") !== -1) {
const preferedArrayNameArray = options.preferedArrayName.split("+");
if (arrayElement[preferedArrayNameArray[0]]) {
const element0 = arrayElement[preferedArrayNameArray[0]].replace(/\./g, "").replace(/\ /g, "");
let element1 = "";
if (preferedArrayNameArray[1].indexOf("/") !== -1) {
const subArray = preferedArrayNameArray[1].split("/");
const subElement = arrayElement[subArray[0]];
if (subElement && subElement[subArray[1]] !== void 0) {
element1 = subElement[subArray[1]];
} else if (arrayElement[subArray[1]] !== void 0) {
element1 = arrayElement[subArray[1]];
}
} else {
element1 = arrayElement[preferedArrayNameArray[1]].replace(/\./g, "").replace(/\ /g, "");
}
arrayPath = element0 + "-" + element1;
}
} else if (options.preferedArrayName && options.preferedArrayName.indexOf("/") !== -1) {
const preferedArrayNameArray = options.preferedArrayName.split("/");
const subElement = arrayElement[preferedArrayNameArray[0]];
if (subElement) {
arrayPath = subElement[preferedArrayNameArray[1]].replace(/\./g, "").replace(/\ /g, "");
}
} else if (options.preferedArrayName && arrayElement[options.preferedArrayName]) {
arrayPath = arrayElement[options.preferedArrayName].replace(/\./g, "");
}
if (options.forceIndex) {
arrayPath = key + index;
}
if (!options.forceIndex && Object.keys(arrayElement).length === 2 && typeof Object.keys(arrayElement)[0] === "string" && typeof Object.keys(arrayElement)[1] === "string" && typeof arrayElement[Object.keys(arrayElement)[0]] !== "object" && typeof arrayElement[Object.keys(arrayElement)[1]] !== "object" && arrayElement[Object.keys(arrayElement)[0]] !== "null") {
let subKey = arrayElement[Object.keys(arrayElement)[0]];
const subValue = arrayElement[Object.keys(arrayElement)[1]];
const subName = Object.keys(arrayElement)[0] + " " + Object.keys(arrayElement)[1];
if (key) {
subKey = key + "." + subKey;
}
if (!this.alreadyCreatedObjects[path + "." + subKey]) {
await this.adapter.setObjectNotExistsAsync(path + "." + subKey, {
type: "state",
common: {
name: subName,
role: this.getRole(subValue, options.write),
type: subValue !== null ? typeof subValue : "mixed",
write: options.write,
read: true
},
native: {}
}).then(() => {
});
}
this.adapter.setState(path + "." + subKey, subValue, true);
continue;
}
await this.parse(path + "." + arrayPath, arrayElement, options);
}
} catch (error) {
this.adapter.log.error("Cannot extract array " + path);
this.adapter.log.error(error);
}
}
isJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
getRole(element, write) {
if (typeof element === "boolean" && !write) {
return "indicator";
}
if (typeof element === "boolean" && write) {
return "switch";
}
if (typeof element === "number" && !write) {
return "value";
}
if (typeof element === "number" && write) {
return "level";
}
if (typeof element === "string") {
return "text";
}
return "state";
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {});
//# sourceMappingURL=json2iob.js.map