Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Löschen von Objekten in Aufzählungen [solved]

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Löschen von Objekten in Aufzählungen [solved]

    This topic has been deleted. Only users with topic management privileges can see it.
    • ceng
      ceng last edited by 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

      paul53 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @ceng last edited by

        @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(...);
            }
        
        ceng 1 Reply Last reply Reply Quote 0
        • ceng
          ceng @paul53 last edited by

          @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

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @ceng last edited by paul53

            @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(...);
                }
            
            ceng 2 Replies Last reply Reply Quote 0
            • ceng
              ceng @paul53 last edited by

              @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 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @ceng last edited by

                @ceng sagte: Die Zeile 272 ist

                Korrektur:

                    let idx = obj.common.members.indexOf(DP_Selected);
                
                1 Reply Last reply Reply Quote 0
                • ceng
                  ceng @paul53 last edited by ceng

                  Danke @paul53
                  Danke für den Support @paul53

                  Mittlerweile 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));
                          }   
                      }
                  
                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  517
                  Online

                  31.9k
                  Users

                  80.1k
                  Topics

                  1.3m
                  Posts

                  2
                  7
                  353
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo