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 -
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(...); } -
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: 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'); }); } } -
@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'); }); } } -
@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(...); }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)); } }
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden