NEWS
Löschen von Objekten in Aufzählungen [solved]
-
Hallo Ihr,
Problem: Objekt (POWER1) wird in Aufzählung (Rooms) bei jedem Script Start angelegt.Ich erstelle per Script Datenpunkte die auf Basis des Friendly Name eine bessere Übersicht in "userdata.0.schalten" bieten. So kann ich ein physisches Device einfach tauschen, ohne den Rest anzupassen. => Gleicher Friendlyname am Sonoff Device und der Rest funktioniert wieder.
Wenn ich das untenstehende Script nutze, wird mir aber der neue Datenpunkt mehrfach in die Aufzählung "rooms" gepusht.
1.) Wie kann ich aus einer Aufzählung löschen, wenn das Device sich vom Raum A in Raum B bewegt. Mein Script lässt das Objekt in Raum A weiter stehen.
2.) Wie kann ich abprüfen, ob das Objekt bereits in der Aufzählung vorhanden ist und dann entweder anlegen oder nichts machen -> Hat Paul53 gelöst. THX
3.) Wie kann ich sicherstellen, dass die Objekte wirklich angelegt werden. Vgl. Zeile 8 im Script. Hier habe ich nach Ausführung des Scripts eine Pause von 1 Sekunden eingebaut. Das funktioniert, ist aber vermutlich optimierungsfähig.if(!existsObject('enum.rooms.' + String(Raumname))) { console.log('Raumname ' + String(Raumname) + ' NICHT in Aufzählung'); } else { let obj = getObject('enum.rooms.' + String(Raumname)) // hier ist das PROBLEM -> Objekt wird IMMER zusätzlich angelegt obj.common.members.push(DP_Selected); //https://forum.iobroker.net/topic/50900/getobject-setobject-bug/4 setObjectAsync('enum.rooms.' + String(Raumname), obj, function (err) { if (err) console.log('Fehler: Zuordnung von ' + String(DP_Selected) + ' zu ' + String(Raumname) + ' fehlgeschlagen. Error=' + err, 'error'); }); }
Gruß
CENG -
@ceng sagte: abprüfen, ob das Objekt bereits in der Aufzählung vorhanden ist
if(!obj.common.members.includes(DP_Selcted) { obj.common.members.push(DP_Selected); setObject(...); }
-
@paul53 sagte in Löschen von Objekten in Aufzählungen:
if(!obj.common.members.includes(DP_Selcted) { obj.common.members.push(DP_Selected); setObject(...); }
THX Paul
Bleibt noch Frage 1 und 3. Hat jemand eine Idee
-
@ceng sagte: 1.) Wie kann ich aus einer Aufzählung löschen
let idx = obj.common.members.indexOf(DP_Selected); if(idx > -1) { obj.common.members.splice(idx, 1); setObject(...); }
-
@paul53
Erstmal vielen Dank für Deine Hilfe.Ich erhalte jetzt allerdings Fehler beim Objekt:
08:52:22.977 info javascript.4 (940122) script.js.Test.Test_SYNC_Sonof: Function #DP Raum zuweisen#: DP_Selected: 0_userdata.0.Lokal.Schalten.Aussen.Garten.Farbwechsler_Gartenlampe Slave 1 Freisitz_POWER1 | Raum: Garten 08:52:22.980 error javascript.4 (940122) script.js.Test.Test_SYNC_Sonof: ReferenceError: common is not defined 08:52:22.980 error javascript.4 (940122) at DP_Raum_zuweisen (script.js.Test.Test_SYNC_Sonof:272:19) 08:52:22.980 error javascript.4 (940122) at Object.<anonymous> (script.js.Test.Test_SYNC_Sonof:473:15)
Die Zeile 272 ist
let idx = common.members.indexOf(DP_Selected);
Das Script habe ich nach Deiner Vorlage angepasst:
//Löschen let obj = getObject('enum.rooms.' + String(RaumnameAmDevice)) if(existsObject('enum.rooms.' + String(RaumnameAmDevice))) { let idx = common.members.indexOf(DP_Selected); if(idx > -1) { console.log('Lösche ' + DP_Selected); obj.common.members.splice(idx, 1); setObjectAsync('enum.rooms.' + RaumnameAmDevice, idx, function (err) { if (err) log('Fehler: Löschen von ' + String(DP_Selected) + ' am ' + String(RaumnameAmDevice) + ' fehlgeschlagen. Error=' + err, 'error'); }); } }
-
-
Danke @paul53
Danke für den Support @paul53Mittlerweile bin ich nach rumprobieren da...
if(existsObject('enum.rooms.' + RaumnameAmDevice)) { console.log('Raum ' + RaumnameAmDevice + ' vorhanden'); let obj = getObject('enum.rooms.' + RaumnameAmDevice) if(obj.common.members.includes(DP_Selected)) { console.log('DP ist in Raumaufzählung vorhanden. Obj ' + JSON.stringify(obj)); let idx = obj.common.members.indexOf(DP_Selected); console.log(DP_Selected + ' ist in der Aufzählung für ' + RaumnameAmDevice + ' an Stelle ' + idx); if(idx > -1) { console.warn('Lösche ' + DP_Selected + ' ID:' + idx); obj.common.members.splice(idx, 1); setObject('enum.rooms.' + RaumnameAmDevice, obj, function (err) { if (err) console.error('Fehler: Lösche ID ' + idx + ' | DP ' + DP_Selected + ' aus Aufzählung ' + String(RaumnameAmDevice) + ' fehlgeschlagen. Error=' + err, 'error'); }); if (getState('0_userdata.0.Global.Debug').val == true) { console.log(('Raumzuweisung für DP_Selected: ' + DP_Selected + ' | RaumAmDevice: ' + RaumnameAmDevice + ' RaumAmDP '+ RaumnameAmDP + ' gelöscht')); } } } else { console.log(DP_Selected + ' ist nicht Aufzählung vorhanden'); } } else { if (getState('0_userdata.0.Global.Debug').val == true) { console.log(('Raum ' + RaumnameAmDevice + ' ist nicht in Aufzählung vorhanden. DP Selected:' + DP_Selected)); } }