Habe mich endlich durchgerungen, meine alte alias-selbstbau-Lösung, basierend auf gegenseitigem on() durch die effizienteren Aliases zu ersetzen. Ich komme auf einige viele, paul53's Scriptvorlage ist wertvoll - ohne die wäre ich das wahrscheinlich noch länger nicht angegangen.
Habe die Vorlage angepasst, da sie bei mir nicht alle Objekte anlegte und vor allem mit den rooms und functions Probleme machte.
Vielleicht kann's ja jemand brauchen, hier mit Beispiel:
// Originalversion: User Paul53, https://forum.iobroker.net/topic/27295/vorlage-alias-per-skript-erzeugen
// Angepasst an die asynchrone Eigenschaft von Javascript, kleine Ergänzungen.
const prefix = 'alias.0.';
const custhist = {
"history.0": {
"enabled": true,
"changesOnly": true,
"debounce": "200",
"maxLength": "960",
"retention": "1209600",
"changesRelogInterval": "60",
"changesMinDelta": 0,
"aliasId": ""
},
"influxdb.0": {
"enabled": true,
"changesOnly": true,
"debounce": "200",
"retention": "63072000",
"changesRelogInterval": "60",
"changesMinDelta": 0,
"storageType": "",
"aliasId": ""
}
};
// Aliasdefinition als Array of Objects
var aa = [
/***
{
idOrigin : prefix + '', // Orignal-Datenpunkt
idRead : '', // Status-Datenpunkt, wenn Status und Kommando getrennt. Leer wenn keine Trennung
idAlias : prefix + '', // Alias-Datenpunkt
recreate : false, // true: evtl. existierender Alias wird gelöscht - EXPERIMENTAL
extend : true, // true: evtl. existierender Alias wird ergänzt - EXPERIMENTAL: extendObject() statt setObject()
typeAlias : '', // Datentyp für Alias: number, boolean, mixed
read : '', // "val < 20 ? true : false" // Erkennung "Aus" --> false erfolgt automatisch
write : '', // "val ? 'Ein' : 'Aus'"
nameAlias : '', // Bezeichnung
role : '', // ioBroker Rolle
desc : '', // Beschreibung
min : 0, // Minimalwert, nur bei Datentyp number
max : 100, // Maximalwert, nur bei Datentyp number
unit : '', // Einheit bei Datentyp number: %, W, °C, usw.
states : '', // {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
custom : []; // leeres Array wird automatisch gesetzt, falls nichts angegeben. Verhindert doppelte Ausführung von
history, ...
raum : '', // enum.room, Groß-/Kleinschreibung in der ID beachten
gewerk : '', // enum.function, Groß-/Kleinschreibung in der ID beachten
owner : '', // Owner, etwa system.user.admin
group : '', // Group, etwa system.group.familie
},
***/
// --------------------
// Batterien
{
idAlias : prefix + 'Batterien.shellyht-F00000',
idOrigin : 'shelly.0.SHHT-1#F00000#1.bat.value',
recreate : true,
extend : true,
nameAlias : 'Shelly HT Sensor',
raum : 'werkstatt',
custom : custhist,
owner : "system.user.admin",
group : "system.group.familie"
},
// --------------------
// Werkstatt
{
idAlias : prefix + "Werkstatt.Klima.Temperatur",
idOrigin : "shelly.0.SHHT-1#F00000#1.tmp.temperatureC",
recreate : false,
extend : true,
nameAlias : "Raumtemperatur",
unit : '°C',
raum : 'werkstatt',
custom : custhist,
owner : "system.user.admin",
group : "system.group.familie"
},
{
idAlias : prefix + "Werkstatt.Klima.Luftfeuchte",
idOrigin : "shelly.0.SHHT-1#F00000#1.hum.value",
recreate : false,
extend : true,
nameAlias : "Luftfeuchte (rel.)",
unit : '%',
raum : 'werkstatt',
custom : custhist,
owner : "system.user.admin",
group : "system.group.familie"
},
{
idAlias : prefix + 'Werkstatt.Entfeuchter.Leistung',
idOrigin : 'sonoff.0.Entfeuchter.ENERGY_Power',
recreate : false,
extend : true,
nameAlias : "Leistungsaufnahme",
unit : "W",
raum : 'werkstatt',
custom : custhist,
owner : "system.user.admin",
group : "system.group.familie"
},
{
idAlias : prefix + 'Werkstatt.Entfeuchter.Schalter',
idOrigin : 'sonoff.0.Entfeuchter.POWER',
recreate : false,
extend : true,
nameAlias : "Schalter",
raum : 'werkstatt',
custom : custhist,
owner : "system.user.admin",
group : "system.group.familie"
},
// ------------------------------
// WOHNZIMMER
{
idAlias : prefix + 'Wohnzimmer.Couchkugel.Schalter',
idOrigin : 'hue.0.Couchkugel.on',
recreate : false,
extend : true,
raum : 'wohnzimmer',
custom : custhist,
owner : "system.user.admin",
group : "system.group.familie"
}
];
// ******************************
// -------------------------------------------------
// -------------------------------------------------
function alias2enum(a, en, cb) {
cb = (typeof(cb) === 'function') ? cb : function() {};
if (en) {
var o = getObject(en);
if(o) {
if (!o.common.members.includes(a)) {
o.common.members.push(a);
setObject(en, o, function(e, o) { cb(); });
} else cb();
} else {
log('alias2enum: ' + en + ' cannot get object', 'warn');
cb();
}
} else {
log('alias2enum: ' + en + ' is invalid', 'warn');
cb();
}
}
// ---------------------------------------------------
// ---------------------------------------------------
function createAlias(o, cb) {
var obj = {};
cb = (typeof(cb) === 'function') ? cb : function() {};
if (!o || ! o.idOrigin || !o.idAlias) {
log(o, 'error');
}
if (!existsState(o.idOrigin)) {
log(o.idOrigin + ' existiert nicht', 'warn');
cb();
return;
}
if (existsState(o.idAlias)) {
if (o.recreate) {
log(o.idAlias + ' wird gelöscht', 'warn');
// EXPERIMENTAL
// deleteObject() gibt keinen Fehler aus, löscht aber auch nicht.
// falsche Anwendung? --> Recherchieren... ;-)
// workaround: recreate auf false und extend auf true setzen.
deleteObject(o.idAlias, false, function(err, obj) {
o.recreate = false;
o.extend = true;
createAlias(o, cb);
return;
});
} else if (!o.extend) {
log(o.idAlias + ' schon vorhanden')
cb();
return;
} else {
log(o.idAlias + ' wird ergänzt');
}
} else {
log(o.idAlias + ' wird angelegt');
}
obj.type = 'state';
obj.common = getObject(o.idOrigin).common;
obj.acl = getObject(o.idOrigin).acl;
obj.common.alias = {};
if(o.idRead) {
obj.common.alias.id = {};
obj.common.alias.id.read = o.idRead;
obj.common.alias.id.write = o.idOrigin;
obj.common.read = true;
} else obj.common.alias.id = o.idOrigin;
if(o.typeAlias) obj.common.type = o.typeAlias;
if(obj.common.read !== false && o.read) obj.common.alias.read = o.read;
if(obj.common.write !== false && o.write) obj.common.alias.write = o.write;
if(o.nameAlias) obj.common.name = o.nameAlias;
if(o.role) obj.common.role = o.role;
if(o.desc) obj.common.desc = o.desc;
if(o.min !== undefined) obj.common.min = o.min;
if(o.max !== undefined) obj.common.max = o.max;
if(o.unit) obj.common.unit = o.unit;
if(o.states) obj.common.states = o.states;
if(o.owner && obj.acl.owner) obj.acl.owner = o.owner;
if(o.group && obj.acl.ownerGroup) obj.acl.ownerGroup = o.group;
if(o.custom) {
obj.common.custom = o.custom;
} else {
obj.common.custom = [];
}
obj.native = {};
// EXPERIMENTAL
// Auswirkung von extendObject() auf Historydaten?
extendObject(o.idAlias, obj, function(e, oa) {
if (e) {
log('Alias ' + o.idAlias + ' nicht angelegt - Fehler ' + e, 'error');
cb();
return;
}
log(o.idAlias + ' wird zum Raum ' + o.raum + ' hinzugefügt', 'info');
alias2enum(o.idAlias, 'enum.rooms.' + o.raum, function() {
if (o.gewerk) {
log(o.idAlias + ' wird zur Funktion ' + o.gewerk + ' hinzugefügt', 'info');
alias2enum(o.idAlias, 'enum.funtions.' + o.gewerk, cb);
} else cb();
});
});
}
// ---------------------------------------------------
// ---------------------------------------------------
function createAliases() {
if (!aa) return;
if (!aa.length) return;
createAlias(aa.shift(), createAliases);
}
// *******************************
createAliases();
Danke paul53