Im folgenden Skript wird ein Alias zu einem Datenpunkt mit dessen common-Eigenschaften erstellt. Bei gewollten Abweichungen von common-Eigenschaften des Alias zum Original muss man die zugehörigen // (Kommentar) entfernen und den gewünschten Wert zuweisen.
// Original-Datenpunkt
const idOrigin = 'mqtt.0.switch.status';
// Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
// Bei Nicht-Verwendung Leerstring '' zuweisen
const idRead = '';
// Alias-Datenpunkt
const idAlias = 'Pool.Pumpe.Schalter';
var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
// Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
nameAlias = 'Poolpumpe Ein';
desc = 'per Script erstellt';
// typeAlias = 'boolean'; // oder 'number'
// read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch
// write = "val ? String(1) : String(0)";
// role = 'value';
// min = 0; // nur Zahlen
// max = 100; // nur Zahlen
// unit = '%'; // nur für Zahlen
// states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
custom = {}; // verhindert doppelte Ausführung von history, ...
// raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
// gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
// Ab hier nichts ändern !!
function createAlias(idDst, idSrc, idRd) {
if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
else {
var obj = {};
obj.type = 'state';
obj.common = getObject(idSrc).common;
obj.common.alias = {};
if(idRd) {
obj.common.alias.id = {};
obj.common.alias.id.read = idRd;
obj.common.alias.id.write = idSrc;
obj.common.read = true;
} else obj.common.alias.id = idSrc;
if(typeAlias) obj.common.type = typeAlias;
if(obj.common.read !== false && read) obj.common.alias.read = read;
if(obj.common.write !== false && write) obj.common.alias.write = write;
if(nameAlias) obj.common.name = nameAlias;
if(role) obj.common.role = role;
if(desc) obj.common.desc = desc;
if(obj.common.type == 'number') {
if(min !== undefined) obj.common.min = min;
if(max !== undefined) obj.common.max = max;
if(unit) obj.common.unit = unit;
} else {
if(obj.common.min !== undefined) delete obj.common.min;
if(obj.common.max !== undefined) delete obj.common.max;
if(obj.common.unit) delete obj.common.unit;
}
if(states) obj.common.states = states;
if(custom && obj.common.custom) obj.common.custom = custom;
obj.native = {};
setObject(idDst, obj, function() {
if(idRd) setState(idRd, getState(idRd).val, true);
else setState(idSrc, getState(idSrc).val, true);
});
if(raum && existsObject('enum.rooms.' + raum)) {
let obj = getObject('enum.rooms.' + raum)
obj.common.members.push(idDst);
setObject('enum.rooms.' + raum, obj);
}
if(gewerk && existsObject('enum.functions.' + gewerk)) {
let obj = getObject('enum.functions.' + gewerk)
obj.common.members.push(idDst);
setObject('enum.functions.' + gewerk, obj);
}
}
}
createAlias('alias.0.' + idAlias, idOrigin, idRead);
Beispiele für Konvertierung (write);
write = "val ? 1 : 0"; // boolean --> binary
write = "val ? 'On' : 'Off'"; // boolean --> string
write = "val.toString()"; // number --> string dezimal
write = "val.toFixed(2)"; // number --> string mit 2 Nachkommastellen
EDIT(20.12.2019): obj.native ergänzt.
EDIT(16.01.2020): Abfrage (Zeile 20) geändert
EDIT(06.02.2020): obj.common.custom ergänzt
EDIT(17.02.2020): Da man Raum und Gewerk in die Struktur der Alias-ID einbringen kann, sind enums für Raum und Gewerk oftmals nicht erforderlich. Für diejenigen, die den erzeugten Alias-Datenpunkt zu enum.rooms und/oder enum.functions hinzufügen wollen, wurde das Skript erweitert.
EDIT(21.04.2020): Erweiterung für getrennte Kommando- und Status-Datenpunkte ab js-controller 3.x.
EDIT(05.12.2020): Wenn Alias-Typ keine Zahl ist, werden min, max und unit gelöscht, falls vorhanden
EDIT(16.02.2021): Zeile 23 geändert von leerem Array in leeres Objekt








