Hallo zusammen,
ich bin kürzlich vom deconz auf den zigbee Adapter umgestiegen und habe mich über den Aufwand beim Anpassen der Geräte-IDs in meinen Skripten und in VIS geärgert. Für die Zukunft wollte ich auch zur besseren Lesbarkeit nur noch mit alias Geräten arbeiten.
Nach ein wenig Recherche bin ich erstmal auf den alias Adapter gestoßen, der in der Konfiguration aber nicht das bietet, was ich mir vorstelle. Aufbauend auf dem createAlias script von @paul53 und dem alias Adapter ist nun ein Skript entstanden, welches ich hier gerne teilen möchte - vielleicht hat der eine oder andere da Bedarf.
Was das Skript macht:
das Skript schaut in eine Aufzählung "aliasdevices" und generiert für alle Gruppen, die dort eingetragen sind, alias-Geräte. States werden dabei komplett übernommen.
Die ID des neuen Gerätes ist alias.0.<enumGroup>.<aliasID>
enumGroup: Gerätegruppe in der der Aufzählung "aliasDevices"
aliasID: kommt aus originalen Gerätenamen: z.b. "LED124x12 [<aliasID>]
-> d.h. im Devicenamen wird nach der zukünftigen alias-ID gesucht, die in [] eingeschlossen ist.
Aus den folgenden Geräten...
und dieser Aufzählung....
werden diese alias Geräte angelegt:
Das Skript kann leicht an andere Wünsche angepasst werden (z.B. automatische Hierarchie basierend auf Funktionen oder Räumen).
Vielleicht nützt es dem einen oder anderen, dann viel Spass damit
/* -----------------------------------------------------------------------
enum-alias-devices by cpio, 2020
This script creates alias devices in alias.0.
includes createAlias from paul53 found here: https://forum.iobroker.net/topic/27295/vorlage-alias-per-skript-erzeugen
(part of this script)
Prerequsites:
- alias adapter installed
- device is listed in a enumeration called "aliasdevices"
- device name contains "[<aliasID>]" where <aliasID> is a unique identifier
Enum group can contain "." which will lead to subfoldr in alias.0, e.g.
Example:
- Enum :"aliasDevices"
- Enum group: "kitchen.light"
- group contains a device with common.name: "LED12455 [kitchenlight1]"
Script will create alias a device with
- id: "alias.0.kitchen.light.kitchenlight1"
- common.name: "LED12455 [kitchenlight]"
----------------------------------------------------------------------- */
var DEVICES ={}; // srcId -> targetId
var devEnum = getEnums("aliasdevices");
//loop through all groups in aliasdevices enum:
for (var idxGroup=0;idxGroup<devEnum.length;idxGroup++){
var aliasGroup = devEnum[idxGroup].name;
console.log ("Group: " + aliasGroup);
var members=devEnum[idxGroup].members;
// loop through all members of enum group:
for (var idxMember=0; idxMember<members.length;idxMember++){
var srcId = members[idxMember];
var srcObj = getObject(srcId);
//console.log ("src: " + srcId + " --- " + srcObj.common.name);
// try to indentify target id from src name:
var srcName = srcObj.common.name;
const regex = new RegExp("\[.+\]");
if (regex.test(srcName)){
var destId = srcName;
//destId=destId.replace(/(^[^/[]+[)/, "---");
destId=destId.replace(/([^[]+[)/, "");
destId=destId.replace(/(])/, "");
//console.log (prefix + " " + devName);
destId = "alias.0."+aliasGroup+"."+destId;
console.log (srcId + ": alias id found: "+ destId);
DEVICES[srcId] = destId;
setObject(destId, {common: {name: srcName}});
}else {
console.log (srcId + ": Skipped. No matching id found in name.");//cp section in raw data found."
continue;
}
}
}
for (var key in DEVICES){
var srcId = key;//devAlias[idx].srcId;
var srcObj = getObject(srcId);
var dstId = DEVICES[key];
//https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getobject
console.log("");
console.log("#######Creating Alias for: " + srcName)
$("[id="+srcId+"]").each(function(id, i) {
var aState=id.split (".");
var SRC = id;
var DST = dstId+"."+aState[aState.length-1];
console.log("- Creating Alias: - srcId: " + SRC + " dstId:" +DST)
createAlias(SRC, DST);
});
}
// --------------------------------------------------------------------------------------------
// CREATE ALIAS SCRIPT AUS DEM IOBROKER FORUM
var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom;
// Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
// nameAlias = 'Licht Haustür';
// desc = 'per Script erstellt';
// typeAlias = 'boolean'; // oder 'number'
// read = "val == 'Ein' ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch
// write = "val ? 'Ein' : 'Aus'";
// role = 'switch';
// 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, telegram, mqtt-client, ...
function createAlias(idSrc, idDst) {
if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
else {
var obj = {};
obj.type = 'state';
obj.common = getObject(idSrc).common;
obj.common.alias = {};
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(min !== undefined) obj.common.min = min;
if(max !== undefined) obj.common.max = max;
if(unit) obj.common.unit = unit;
if(states) obj.common.states = states;
if(custom && obj.common.custom) obj.common.custom = custom;
obj.native = {};
setObject(idDst, obj);
}
}