Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. setObject() setzt keinen Default-Wert

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    setObject() setzt keinen Default-Wert

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

      Im folgenden Demo-Script benutze ich setObject(), um einen Datenpunkt in meiner eigenen Hierarchie zu erzeugen. Leider wird dabei nicht der Default-Wert eingetragen. Es gibt aus 2018 dazu einen entsprechenden Eintrag im Github, der später als gelöst markiert wurde.

      Leider komme ich auch nicht mit der Alternative weiter, indem ich im Callback setState() benutze. Hier scheitere ich daran, dass die ID automatisch um die Adapter-Instanz ("javascript.0") erweitert wird.

      Wie schaffe ich es nun, einem neuen Datenpunkt nach der Anlage einem Initialwert mitzugeben?

      const aFolder  = "Rollo.Erdgeschoss.Kueche";
      
      function create_State(aID, aRoomName, aFunctionName, aCommon)
      {
          var aExtObj = getObject(aID);
          const aRoomID = 'enum.rooms.' + aRoomName;
          var aRoom = getObject(aRoomID);
          const aFuncID = 'enum.functions.' + aFunctionName;
          var aFunc = getObject(aFuncID);
          var aObj = {};
      
          aObj.type = 'state';
          aObj.common = aCommon;
          aObj.common.name = aObj.common.desc;
          if (!aExtObj)
          {
          setObject(aID, aObj, function (err) {
              if (err) 
              {
                  log('Cannot write object: ' + err)
              }
              else
              { 
                  this.setState(aID, aCommon.def);
                  //aID beginnt mit "javascript.0." 
                  log(aCommon.def);
              }    
          });
          }
          else
          {
              extendObject(aID, aObj); 
          }
          if (aRoom)
          {
              const aPos = aRoom.common.members.indexOf(aID);
              if (aPos === -1) 
              {
                  aRoom.common.members.push(aID);
                  aRoom.from = 'system.adapter.' + this.namespace;
                  aRoom.ts = Date.now();
                  setObject(aRoomID, aRoom);
              }        
          }
          if (aFunc)
          {
              const aPosFunc = aFunc.common.members.indexOf(aID);
              if (aPosFunc === -1) 
              {
                  aFunc.common.members.push(aID);
                  aFunc.from = 'system.adapter.' + this.namespace;
                  aFunc.ts = Date.now();
                  setObject(aFuncID, aFunc);
              }        
          }
      }
      create_State(aFolder + ".Schaltzeit2", 'küche', 'rollladen', {read: true, write: true, role: "state.blind", 
                      desc: "Schaltzeit2", type: "string", def: "empty" }); 
      
      stopScript();
      
      paul53 2 Replies Last reply Reply Quote 0
      • OliverIO
        OliverIO last edited by

        bin nicht ganz sicher, aber ich glaube das attribut heißt def.

        Also

        aObj.type = 'state';
        aObj.def = 'abc';
        aObj.common = aCommon;
        aObj.common.name = aObj.common.desc;
        
        N 1 Reply Last reply Reply Quote 0
        • N
          neo4a @OliverIO last edited by

          @OliverIO sagte in setObject() setzt keinen Default-Wert:

          bin nicht ganz sicher, aber ich glaube das attribut heißt def.

          Genau. Das habe ich auch in der Struktur mitgegeben (im Script mit dem Wert "empty"). Es wird mir sogar in der Detail-Ansicht des Datenpunkts als Standardwert angezeigt. Nur wird der Wert bei der Neuanlage nicht eingetragen.

          OliverIO 1 Reply Last reply Reply Quote 0
          • Stabilostick
            Stabilostick last edited by Stabilostick

            Schreibt man das nicht so?

            createState(aFolder + ".Schaltzeit2", {
                                            name: "küche",
                                            type: "string",
                                            role: "state.blind",
                                            def:  "empty"
                                        });
            
            N 1 Reply Last reply Reply Quote 0
            • N
              neo4a @Stabilostick last edited by

              @Stabilostickin
              createState erzeugt den Datenpunkt in die Adapter-Hierarchie (z.B. "javascript.0"). Weil ich aber eine Adapter-unabhängige Struktur benutze, habe ich das mit setObject umsetzen müssen.

              Die Syntax aus meinem Demo-Script eignet sich für die Auslagerung in ein globales Script.

              1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @neo4a last edited by

                @neo4a das sehe ich in deinem Code Beispiel aber nicht. Das einzige Mal sehe ich das bei setstate und nicht bei setobject

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

                  @neo4a sagte:

                  const aFolder  = "Rollo.Erdgeschoss.Kueche";
                  

                  Das funktioniert nicht, da zwischen dem ersten und dem zweiten Punkt eine Ziffer stehen muss, z.B. so

                  const aFolder  = "meineDatenpunkte.0.Rollo.Erdgeschoss.Kueche";
                  
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @neo4a last edited by paul53

                    @neo4a Dieses vereinfachte Skript (ohne enums)

                    function createDp(id, common) {
                        if(!existsState(id)) {
                            var obj = {};
                            obj.type = 'state';
                            obj.native = {};
                            obj.common = common;
                            setObject(id, obj, function (err) {
                                if (err) log('Cannot write object: ' + err)
                                else {
                                    var init = null;
                                    if(common.def === undefined) {
                                        if(common.type === 'number') init = 0;
                                        if(common.type === 'boolean') init = false;
                                        if(common.type === 'string') init = '';
                                    } else init = common.def;
                                    setState(id, init);
                                }
                            });
                        }
                    }
                    
                    const idDp = 'dp.0.Rollo.Erdgeschoss.Kueche';
                    createDp(idDp + ".Schaltzeit2", {read: true, write: true, role: "state.blind", desc: "Schaltzeit2", type: "string", def: "empty" });
                    

                    funktioniert bei mir.

                    createDP_Rollo.JPG

                    EDIT(06.07.2020): Abfrage auf existsState(id) geändert.

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

                      @paul53 ist getObject nicht asynchron? dann müsste alles nach getObject noch in den Callback von getObject gepackt werden.

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

                        @OliverIO sagte:

                        ist getObject nicht asynchron?

                        getObject() des JS-Adapters arbeitet synchron, wenn keine Callback-Funktion übergeben wird.

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

                          @paul53
                          Nachdem ich keinen prinzipiellen Unterschied zwischen unseren Scripten erkennen konnte (bezogen auf den geschilderten Fehlerfall), habe ich mein Script noch einmal laufen lassen und musste feststellen, dass ohne jegliche Änderung das Problem verschwunden ist.

                          Mein Fehler:

                          // falsch:
                                      this.setState(aID, aCommon.def);
                          // richtig
                                      setState(aID, aCommon.def);
                          
                          paul53 1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 @neo4a last edited by

                            @neo4a sagte:

                            Nachdem ich keinen prinzipiellen Unterschied zwischen unseren Scripten erkennen konnte

                            Der prinzipielle Unterschied ist die ID: Wenn zwischen dem ersten und zweiten Punkt keine Ziffer steht, gibt es regelmäßig Probleme.

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

                              @paul53
                              Danke für den Hinweis. Ich benutze diese "ohne-Punkt-Hierarchie" nun seit mehreren Jahren. Wahrscheinlich habe ich nur Glückgehabt...

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate
                              FAQ Cloud / IOT
                              HowTo: Node.js-Update
                              HowTo: Backup/Restore
                              Downloads
                              BLOG

                              867
                              Online

                              31.6k
                              Users

                              79.5k
                              Topics

                              1.3m
                              Posts

                              setobject
                              4
                              13
                              1266
                              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