NEWS
[gelöst] Zusammenführen von enum.functions
-
Moin Leute,
gibt es eine Möglichkeit, per Script, enum.functions zusammenzuführen?
Hintergrund, ich habe z.B. enum.functions.Licht (von Homematic) und enum.functions.light. Ich würde jetzt gerne alle Lampen (Objekte) in enum.functions.Licht schieben ohne alle händisch anzupassen, da es über 30 Stellen wären.
Habt ihr Ideen?
Gruß,
Mark -
@mark77
Hier ein Script, das 0_userdata.0.lampen.state_1 und _2 anlegt.
Schau dir mal addToEnum() an'use strict'; async function addToEnum(enumName, newStateId) { let myEnum = await getObjectAsync(enumName); if (myEnum) { let pos = myEnum.common.members.indexOf(newStateId); if (pos === -1) { myEnum.common.members.push(newStateId); myEnum.from = "system.adapter." + "0"; myEnum.ts = new Date().getTime(); setObjectAsync(enumName, myEnum); } } } async function CreateStates() { try { for (let i = 1; i < 3; i++) { const id = `0_userdata.0.lampen.state_${i}`; if (await existsStateAsync(id)) { log(`State ${id} already exists`, 'warn'); } else { await createStateAsync(id, { type: 'boolean', read: true, write: true, role: 'switch', def: false, smartName: { smartType: "LIGHT" } }); await addToEnum("enum.functions.light", id); await addToEnum("enum.rooms.living_room", id); const stateObject = await getStateAsync(id); if (stateObject && (stateObject.val || stateObject.val === false)) { log(`State '${id}' created, value: '${stateObject.val}'`) } else { log(`Unable to get state value of '${id}'.`, 'error'); } } } } catch (error) { log(`Unexpected error - ${error}`, 'error'); } } CreateStates();
-
@mark77 sagte: alle Lampen (Objekte) in enum.functions.Licht schieben
Versuche es mal so (nicht getestet):
const idslight = getObject('enum.functions.light').common.members; const objLicht = getObject('enum.functions.Licht'); for(let i = 0; i < idslight.length; i++) { objLicht.common.members.push(idslight[i]); } setObject('enum.functions.Licht', objLicht);
-
Ich danke euch, schaue ich mir mal an!
-
@paul53 deine Lösung könnte funktionieren, zumindest sieht es als Trockenlauf (als Log Ausgabe) gut aus.
Ich bin akllerdings den Weg gegangen, einfach in der Homematic Licht in lights umzubenennen.Wald, Büme, ich...
Danke für eure Bemühungen!
Gruß,
Mark -
@paul53 funktioniert bestens.
Habe das Script nur ein wenig angepasst, damit man nicht vergisst, die letzte Zeile zu ändern, sonst ist das Chaos groß
var oldNames = 'enum.rooms.kleiner_flur'; var newNames = 'enum.rooms.kleiner Flur'; const idslight = getObject(oldNames).common.members; const objLicht = getObject(newNames); for(let i = 0; i < idslight.length; i++) { objLicht.common.members.push(idslight[i]); } setObject(newNames, objLicht);
DANKE!
-
@mark77 sagte: damit man nicht vergisst, die letzte Zeile zu ändern
Etwas allgemeiner gehalten:
const idSrc = 'enum.functions.light'; const idDst = 'enum.functions.Licht'; const membersSrc = getObject(idSrc).common.members; const objDst = getObject(idDst); for(let i = 0; i < membersSrc.length; i++) { objDst.common.members.push(membersSrc[i]); } setObject(idDst, objDst);