NEWS
Alias-Manager: Entfernung min & max aus Boolean Objektdaten
-
Tach zusammen,
da ich den Alias-Adapter gerne nutze, habe ich ein kleines bisschen Zeit investiert und ein kleine Besonderheit mit JS-Skripten gelöst.
Offen und ehrlich: ChatGPT hat mir dabei geholfen und es hat auch ein paar Runden gebraucht, bis die Skripte funktionierten.
Interessant: Ich habe die Umsetzung zuerst mit Claude versucht, aber der liebe Claude konnte das Problem nicht lösen, auch bei 5 oder 6 Iterationen, bei denen "er" sich im Kreis drehte. War aber auch die Umsonst-Version.
Bei der Anlage von Aliasen erzeugt der Adapter in den Objektdaten von Boolean-Datenpunkten immer auch Zeilen mit max="" und min="", was im Protokoll immer zu Warnhinweisen führt - jedenfalls bei mir.
Beispiel:
{ "common": { "alias": { "id": "hm-rpc.1.0001D709A0FFB8.1.PRESS_LONG_RELEASE" }, "name": "EG Flur Aktor Zwischenstecker Lichterkette 1 PRESS_LONG_RELEASE", "role": "button.release", "type": "boolean", "unit": "", "min": "", "max": "", "read": false, "write": true }, "native": {}, "type": "state", "_id": "alias.0.EG.Flur.Aktor Zwischenstecker Lichterkette.1.PRESS_LONG_RELEASE", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1770735186091 }Folgende Skripte haben bei mir super funktioniert. Ich übernehme natürlich keine Gewähr und rate dringend, vor Anwendung ein Backup anzufertigen !
- Skript: Dry-Run (nur Test-Durchlauf, keine Veränderungen vorgenommen, Backup der erkannten Objektdaten in 0.userdata.0)
const PREFIX = 'alias.0.'; const EXPORT_STATE = '0_userdata.0.boolean_minmax_backup'; let backup = []; let totalChecked = 0; let totalFound = 0; const states = $(PREFIX + '*'); states.each(id => { totalChecked++; getObject(id, (err, obj) => { if (!obj || !obj.common) return; if (obj.common.type === 'boolean') { if (obj.common.hasOwnProperty('min') || obj.common.hasOwnProperty('max')) { totalFound++; backup.push({ id: id, min: obj.common.hasOwnProperty('min') ? obj.common.min : "__NOT_EXISTING__", max: obj.common.hasOwnProperty('max') ? obj.common.max : "__NOT_EXISTING__" }); log(`[EXPORT] gefunden: ${id}`, 'info'); } } // Wenn letzter State geprüft → speichern if (totalChecked === states.length) { createState(EXPORT_STATE, '', { type: 'string', role: 'json' }, () => { setState(EXPORT_STATE, JSON.stringify(backup, null, 2), true); log('====================================='); log(`Backup erstellt: ${EXPORT_STATE}`); log(`Gesicherte Objekte: ${totalFound}`); log('====================================='); }); } }); });- Skript: Change (Echtlauf)
const PREFIX = 'alias.0.'; let totalChecked = 0; let totalChanged = 0; const states = $(PREFIX + '*'); states.each(id => { totalChecked++; getObject(id, (err, obj) => { if (!obj || !obj.common) return; if (obj.common.type === 'boolean') { let changed = false; if (obj.common.hasOwnProperty('min')) { delete obj.common.min; changed = true; } if (obj.common.hasOwnProperty('max')) { delete obj.common.max; changed = true; } if (changed) { totalChanged++; setObject(id, obj); log(`[CHANGE] bereinigt: ${id}`, 'info'); } } // Abschlussmeldung if (totalChecked === states.length) { log('====================================='); log(`Geprüfte States: ${totalChecked}`); log(`Geänderte States: ${totalChanged}`); log('====================================='); } }); });- Skript: Undo (optional: Wiederherstellung, falls notwendig oder gewünscht)
const EXPORT_STATE = '0_userdata.0.boolean_minmax_backup'; getState(EXPORT_STATE, (err, state) => { if (!state || !state.val) { log('Kein Backup gefunden!', 'error'); return; } let backup; try { backup = JSON.parse(state.val); } catch (e) { log('Backup JSON fehlerhaft', 'error'); return; } let totalProcessed = 0; backup.forEach(entry => { getObject(entry.id, (err, obj) => { if (!obj || !obj.common) return; if (entry.min !== "__NOT_EXISTING__") { obj.common.min = entry.min; } else { delete obj.common.min; } if (entry.max !== "__NOT_EXISTING__") { obj.common.max = entry.max; } else { delete obj.common.max; } setObject(entry.id, obj); totalProcessed++; log(`[UNDO] wiederhergestellt: ${entry.id}`, 'info'); if (totalProcessed === backup.length) { log('====================================='); log(`Wiederhergestellte States: ${totalProcessed}`); log('====================================='); } }); }); });