Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Datenpunkt vom Typ Array States löschen

    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

    Datenpunkt vom Typ Array States löschen

    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      RaBu60 last edited by RaBu60

      Hallo,

      ich sitze hier schon seit Tagen vor einem Problem mit einem Datenpunkt vom Typ Array.
      Alles Probieren, Doku lesen, Googeln und Forumsuche (vielleicht habe ich auch die falschen Stichworte verwendet) hat mich nicht weiter gebracht ☹

      Ich habe einen Datenpunk unter "0_userdata.0.NeuerZustand" mit folgender Definition angelegt:

      "common": {
          "name": "NeuerZustand",
          "desc": "Manuell erzeugt",
          "role": "state",
          "type": "array",
          "read": true,
          "write": true,
          "states": {
              "1": "Erdgeschoss",
              "2": "Obergeschoss",
              "3": "Beete",
              "4": "Halle"
          }
        }
      

      Mit

      extendObject('0_userdata.0.NeuerZustand', {common: { "states": { 
              "1": "Erdgeschoss",
              "2": "Obergeschoss",
              "3": "Dach",
              "4": "Halle"
          }}})
      

      kann ich den Text der einzelnen Elemente im Array (im Beispiel oben Beete --> Dach) ändern bzw. neue Elemente einfügen.

      Wie kann ich in dem Array einzelne Elemente löschen bzw. das ganze Array löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?

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

        @rabu60
        So wie common.states angelegt ist, muss der Datenpunkt vom Typ "number" sein - nicht "array". Das Objekt common.states enthält die Zuweisung von Zustandstexten zu Werten.

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

          @rabu60 sagte: löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?

          Du möchtest das Objekt common.states löschen? Man kann es leeren:

          extendObject('0_userdata.0.NeuerZustand', {common: {states: {}}})
          

          Eigentlich sind die Objekte statisch, d.h. sie sollten konstant bleiben. Variable Werte schreibt man mit setState() in den Datenpunktwert. Was möchtest Du erreichen?

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

            @paul53 sagte in Datenpunkt vom Typ Array States löschen:

            @rabu60 sagte: löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?

            Du möchtest das Objekt common.states löschen? Man kann es leeren:

            extendObject('0_userdata.0.NeuerZustand', {common: {states: {}}})
            

            Ich habe jetzt den Datenpunkt mit Typ "number" neu angelegt und die States geschrieben.
            Der Vorschlag es zu leeren hat leider auch nicht funktioniert.

            Eigentlich sind die Objekte statisch, d.h. sie sollten konstant bleiben. Variable Werte schreibt man mit setState() in den Datenpunktwert. Was möchtest Du erreichen?

            Nun, ich möchte, dass in diesem Datenpunkt nur bestimmte Werte gespeichert werden können. Leider ist diese Werteliste unter bestimmten Bedingungen variabel und nicht immer (wie in meinem Beispiel) Werte zwischen 1 und <n>

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

              @rabu60 sagte: Werteliste unter bestimmten Bedingungen variabel

              Wie variabel? Genügt es nicht, common.min (1), common.max (4) und common.step (1) zu setzen? Dann können zumindest Skripte keine Werte außerhalb des Bereiches schreiben.

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

                @paul53 sagte :

                Wie variabel? Genügt es nicht, common.min (1), common.max (4) und common.step (1) zu setzen? Dann können zumindest Skript keine Werte außerhalb des Bereiches schreiben.

                Nein, leider nicht.

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

                  @rabu60 sagte: Nein, leider nicht.

                  Dann sprengt Deine (ungewöhnliche) Anforderung die Möglichkeiten von ioBroker.

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

                    @paul53
                    Man muss nur hartnäckig sein...

                    Ich habe einen Weg gefunden:

                    let sObjID = '0_userdata.0.NeuerZustand';
                    
                    let obj=getObject(sObjID);
                    
                    delete obj.common.states;
                    
                    setObject(sObjID, obj);
                    
                    extendObject(sObjID, {common: { "states": {
                          1: "Rasen und Hang",
                          2: "Rasen und Hochbeet",
                          5: "Dach",
                          4: "Vorgarten"
                        }
                    }});
                    
                    

                    Vielen Dank für Deine Hilfe und Inspiration. Manchmal braucht man nur einen Denkanstoß 👍

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

                      @rabu60 sagte: Ich habe einen Weg gefunden:

                      Es funktioniert auch so (ohne Löschen):

                      const sObjID = '0_userdata.0.NeuerZustand';
                       
                      const obj = getObject(sObjID);
                       
                      obj.common.states = {
                          1: "Rasen und Hang",
                          2: "Rasen und Hochbeet",
                          5: "Dach",
                          4: "Vorgarten"
                      };
                       
                      setObject(sObjID, obj);
                      

                      In deiner Version können sich setObject() und extendObject() in die Quere kommen, d.h. setObject() ist noch nicht fertig, wenn extendObject() das Objekt einliest. extendObject() müsste in der Callback-Funktion von setObject() ausgeführt werden.

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

                        @paul53

                        Danke für den Hinweis. Ich verzichte auf extendObject() komplett.

                        let sObjID = '0_userdata.0.NeuerZustand';
                        
                        let obj=getObject(sObjID);
                        
                        obj.common["states"]={};
                        
                        var i_list = Array.prototype.slice.apply($("state[state.id=0_userdata.0.Zones.Zone_*.relay]"));
                        for (var i_index in i_list) {
                            i = i_list[i_index];
                            sBasePoint = i.slice(0, i.lastIndexOf('.') + 1);
                            obj.common.states[parseInt(getState((String(sBasePoint) + 'relay')).val)] = getState((String(sBasePoint) + 'name')).val;
                        };
                        
                        setObject(sObjID, obj);
                        

                        So funktioniert es (Hoffentlich) 😜

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

                          Hallo @paul53

                          es funktioniert 👍

                          Nochmals vielen Dank für Deine Unterstützung.

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          827
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          2
                          11
                          343
                          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