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 erstellen und im Anschluss sofort nutzen

    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 erstellen und im Anschluss sofort nutzen

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fastfoot @BananaJoe last edited by fastfoot

      @bananajoe nutze await/async. Ich such dir mal was raus wie ich das mache.

      hier mal ein Fragment wie ich es in fast allen meinen Skripts mittlerweile nutze

      const idBase = '0_userdata.0.Corona.RLP';
      
      async function main(){
      
          let firstRun = await createDatapoints();
          //dein Code
      }
      
      // create data points if not existing
      async function createDatapoints() {
          let dp,
              idKey,
              firstRun = false;
          
          const stateAttributes = {
              "json":{"name":"Daten","type":"string","role":"","read":true,"write":true,"desc":"von Skript erstellt","def":""},
              "Refresh":{"name":"Refresh","type":"boolean","role":"","read":true,"write":true,"desc":"von Skript erstellt","def":false},
              "Excel":{"name":"Hole Exceldatei","type":"boolean","role":"","read":true,"write":true,"desc":"von Skript erstellt","def":false},
          }
      
          for(let key in stateAttributes) {
      
              idKey = idBase + '.' + key;
      
              if (!(await existsStateAsync(idKey))) {
                  dp = stateAttributes[key];
                  firstRun = true;
                  await createStateAsync(idKey, dp);
              }
          }
      
          return firstRun;
      
      }
      
      main();
      

      BananaJoe 1 Reply Last reply Reply Quote 2
      • BananaJoe
        BananaJoe Most Active @dslraser last edited by

        @dslraser hatte ich schon probiert, funktioniert nicht

        dslraser 2 Replies Last reply Reply Quote 0
        • BananaJoe
          BananaJoe Most Active @fastfoot last edited by

          @fastfoot sieht gut aus, teste ich und melde mich dann wieder

          1 Reply Last reply Reply Quote 0
          • dslraser
            dslraser Forum Testing Most Active @BananaJoe last edited by

            @bananajoe sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:

            @dslraser hatte ich schon probiert, funktioniert nicht

            Ich habe es auch probiert und es hat funktioniert.
            Besser ist aber sicher die Variante von @fastfoot

            F 1 Reply Last reply Reply Quote 0
            • dslraser
              dslraser Forum Testing Most Active @BananaJoe last edited by dslraser

              @bananajoe sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:

              @dslraser hatte ich schon probiert, funktioniert nicht

              Bildschirmfoto 2021-04-14 um 22.31.03.png

              14.4.2021, 22:30:53.699	[info ]: javascript.0 (11217) Stop script script.js.99_Test.DP
              14.4.2021, 22:30:53.714	[info ]: javascript.0 (11217) Start javascript script.js.99_Test.DP
              14.4.2021, 22:30:53.719	[info ]: javascript.0 (11217) script.js.99_Test.DP: registered 0 subscriptions and 0 schedules
              14.4.2021, 22:30:53.719	[info ]: javascript.0 (11217) script.js.99_Test.DP: State existiert nicht !
              14.4.2021, 22:30:54.720	[info ]: javascript.0 (11217) script.js.99_Test.DP: Init Wert: eins
              14.4.2021, 22:30:56.726	[info ]: javascript.0 (11217) script.js.99_Test.DP: neuer Wert: zwei
              

              <xml xmlns="https://developers.google.com/blockly/xml">
               <variables>
                 <variable id="[axQ$oH/ZZy.k67+iBx/">id</variable>
                 <variable id="Qs_%`%)=dTI}Bs8Bed4{">Test_DP</variable>
                 <variable type="timeout" id="start">start</variable>
                 <variable type="timeout" id="timeout">timeout</variable>
                 <variable type="timeout" id="timeout2">timeout2</variable>
               </variables>
               <block type="procedures_defcustomreturn" id="7R:L*9?)7Wl^RqVg+G`q" x="13" y="13">
                 <mutation statements="false">
                   <arg name="id" varid="[axQ$oH/ZZy.k67+iBx/"></arg>
                 </mutation>
                 <field name="NAME">existiert_State</field>
                 <field name="SCRIPT">aWYoZXhpc3RzU3RhdGUoaWQpKXJldHVybiB0cnVlOw==</field>
                 <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
               </block>
               <block type="variables_set" id=";XB7Ok*88;t28inG4lUb" x="13" y="63">
                 <field name="VAR" id="Qs_%`%)=dTI}Bs8Bed4{">Test_DP</field>
                 <value name="VALUE">
                   <block type="text" id="g_F5IjXtZsF/PuOv2JC@">
                     <field name="TEXT"></field>
                   </block>
                 </value>
                 <next>
                   <block type="variables_set" id="uek3a!SO(r8$hw@O~Jmk">
                     <field name="VAR" id="Qs_%`%)=dTI}Bs8Bed4{">Test_DP</field>
                     <value name="VALUE">
                       <block type="field_oid" id="X(V59#cpR+Y+~bvQ@i|6">
                         <field name="oid">javascript.0.jsState</field>
                       </block>
                     </value>
                     <next>
                       <block type="create" id="HHlmtV`-A_7.m9zR85D$">
                         <field name="NAME">jsState</field>
                         <value name="VALUE">
                           <block type="text" id="K[|K_Qfm2(TDG0Y?k*IS">
                             <field name="TEXT">eins</field>
                           </block>
                         </value>
                         <value name="COMMON">
                           <block type="text" id="s,QEs/JoRn:|wD~*,1/-">
                             <field name="TEXT">{ "role" : "string" , "type" : "string" , "name" : "A" }</field>
                           </block>
                         </value>
                         <next>
                           <block type="controls_if" id="_{}vOCCEYp^bA_$yLjRQ">
                             <mutation else="1"></mutation>
                             <value name="IF0">
                               <block type="procedures_callcustomreturn" id="NAI$cx_]gw]ScNlY8sHv">
                                 <mutation name="existiert_State">
                                   <arg name="id"></arg>
                                 </mutation>
                                 <value name="ARG0">
                                   <block type="variables_get" id="!quqAfEJA-(COD^#(^}!">
                                     <field name="VAR" id="Qs_%`%)=dTI}Bs8Bed4{">Test_DP</field>
                                   </block>
                                 </value>
                               </block>
                             </value>
                             <statement name="DO0">
                               <block type="debug" id="ex84XR81#x^{i;u$9tL4">
                                 <field name="Severity">log</field>
                                 <value name="TEXT">
                                   <shadow type="text" id="FcUwAVUCPp9c!,OSBi#i">
                                     <field name="TEXT">State existiert</field>
                                   </shadow>
                                 </value>
                               </block>
                             </statement>
                             <statement name="ELSE">
                               <block type="debug" id=")Je::,`YVl$ajVfV{T|z">
                                 <field name="Severity">log</field>
                                 <value name="TEXT">
                                   <shadow type="text" id="uL9YI2CjEl/%O2h1^^9W">
                                     <field name="TEXT">State existiert nicht !</field>
                                   </shadow>
                                 </value>
                               </block>
                             </statement>
                             <next>
                               <block type="timeouts_cleartimeout" id="Q0LjqdL7H{!bg4-!59xY">
                                 <field name="NAME">start</field>
                                 <next>
                                   <block type="timeouts_settimeout" id="SDTJ`3Zfu,,kyDzZdkW=">
                                     <field name="NAME">start</field>
                                     <field name="DELAY">1000</field>
                                     <field name="UNIT">ms</field>
                                     <statement name="STATEMENT">
                                       <block type="debug" id=".ib`nDWC_CW+BWX(bWDf">
                                         <field name="Severity">log</field>
                                         <value name="TEXT">
                                           <shadow type="text">
                                             <field name="TEXT">test</field>
                                           </shadow>
                                           <block type="text_join" id="G+6-C_G}iF{a3MknWJ#$">
                                             <mutation items="2"></mutation>
                                             <value name="ADD0">
                                               <block type="text" id="@yU`(/.UlIQ@#6)Hnljv">
                                                 <field name="TEXT">Init Wert: </field>
                                               </block>
                                             </value>
                                             <value name="ADD1">
                                               <block type="get_value" id="U^wowRz}Hb)m)CD1kVzs">
                                                 <field name="ATTR">val</field>
                                                 <field name="OID">javascript.0.jsState</field>
                                               </block>
                                             </value>
                                           </block>
                                         </value>
                                       </block>
                                     </statement>
                                     <next>
                                       <block type="timeouts_cleartimeout" id="~jy7A|=)c+Gual-U23@E">
                                         <field name="NAME">timeout</field>
                                         <next>
                                           <block type="timeouts_settimeout" id="?HBGpk^/~g~Yei?H`H.P">
                                             <field name="NAME">timeout</field>
                                             <field name="DELAY">2000</field>
                                             <field name="UNIT">ms</field>
                                             <statement name="STATEMENT">
                                               <block type="control_ex" id="kFMZS@qF.mQq@SKi?BRa" inline="true">
                                                 <field name="TYPE">true</field>
                                                 <field name="CLEAR_RUNNING">FALSE</field>
                                                 <value name="OID">
                                                   <shadow type="field_oid" id="o63hWk+tRd)eW?[LG`ic">
                                                     <field name="oid">javascript.0.jsState</field>
                                                   </shadow>
                                                 </value>
                                                 <value name="VALUE">
                                                   <shadow type="logic_boolean" id="YWLv`cI;MnL$:ROj/+go">
                                                     <field name="BOOL">TRUE</field>
                                                   </shadow>
                                                   <block type="text" id="Pqzi@{ywJhPhb1v-e5=D">
                                                     <field name="TEXT">zwei</field>
                                                   </block>
                                                 </value>
                                                 <value name="DELAY_MS">
                                                   <shadow type="math_number" id="%;SkD6-ulX==N)$=%Rn:">
                                                     <field name="NUM">0</field>
                                                   </shadow>
                                                 </value>
                                               </block>
                                             </statement>
                                             <next>
                                               <block type="timeouts_cleartimeout" id="y(^O#,e:*4$}%mfIEDmw">
                                                 <field name="NAME">timeout2</field>
                                                 <next>
                                                   <block type="timeouts_settimeout" id="9x}cpSoW-a)uSCUe!.$M">
                                                     <field name="NAME">timeout2</field>
                                                     <field name="DELAY">3000</field>
                                                     <field name="UNIT">ms</field>
                                                     <statement name="STATEMENT">
                                                       <block type="debug" id=")loTA?exp*K-#=)ujNhu">
                                                         <field name="Severity">log</field>
                                                         <value name="TEXT">
                                                           <shadow type="text" id="RMbHk^2Y)g|dimF[evPk">
                                                             <field name="TEXT">test</field>
                                                           </shadow>
                                                           <block type="text_join" id="W-TClT~P;89/qj@QW`qh">
                                                             <mutation items="2"></mutation>
                                                             <value name="ADD0">
                                                               <block type="text" id="HVC{,(].e0X6]}_}^FxV">
                                                                 <field name="TEXT">neuer Wert: </field>
                                                               </block>
                                                             </value>
                                                             <value name="ADD1">
                                                               <block type="get_value" id="Wi%ull^FE?3+X+Ay6_Z(">
                                                                 <field name="ATTR">val</field>
                                                                 <field name="OID">javascript.0.jsState</field>
                                                               </block>
                                                             </value>
                                                           </block>
                                                         </value>
                                                       </block>
                                                     </statement>
                                                   </block>
                                                 </next>
                                               </block>
                                             </next>
                                           </block>
                                         </next>
                                       </block>
                                     </next>
                                   </block>
                                 </next>
                               </block>
                             </next>
                           </block>
                         </next>
                       </block>
                     </next>
                   </block>
                 </next>
               </block>
              </xml>
              

              EDIT: Test Blockly nochmal erweitert...

              1 Reply Last reply Reply Quote 0
              • F
                fastfoot @dslraser last edited by

                @dslraser sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:

                @bananajoe sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:

                @dslraser hatte ich schon probiert, funktioniert nicht

                Ich habe es auch probiert und es hat funktioniert.
                Besser ist aber sicher die Variante von @fastfoot

                die xxxStateAsync() Funktionen sind relativ neu im JS-Controller. Sie ermöglichen in Verbindung mit await auf das Ende der Ausführung zu warten, gleichzeitig blockiert dieses Warten aber nicht das gesamte restliche System, d.h. jegliche Events werden trotzdem abgearbeitet. Natürlich müsste man das nicht so aufblähen wie im Beispiel, es ist speziell als 'Vorspann' für Skripte gedacht, so dass sichergestellt ist dass benötigte Datenpunkte verfügbar sind. Zu beachten ist dass await nur in einer Funktion aufgerufen werden darf die mit async definiert wurde. Meines Wissens nach bietet Blockly (noch?) kein createStateAsync(), man müsste das dann dort mit einer JS-Function machen. Ein Timeout birgt immer die Gefahr dass er zu kurz ist, wählt man ihn zu groß dann ärgert man sich 🙂 Mit await/async spart man sich dieses Ärgernis...

                Hier noch ne Minimalversion:

                let idKey = "0_userdata.0.test.MyDP";
                let dp = {"name":"Daten","type":"string","role":"","read":true,"write":true,"desc":"von Skript erstellt","def":""};
                async function test(){
                    await createStateAsync(idKey, dp);
                    setState(idKey, 'Mein Wert');
                }
                
                dslraser 1 Reply Last reply Reply Quote 2
                • dslraser
                  dslraser Forum Testing Most Active @fastfoot last edited by dslraser

                  @fastfoot
                  vielen Dank für Deine Beispiele.
                  Bisher habe ich das Script benutzt

                  https://github.com/Mic-M/iobroker-createUserStates

                  bzw.

                  https://github.com/Mic-M/iobroker-createUserStates/blob/master/createUserStates.js

                  F 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @dslraser last edited by

                    @dslraser sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:

                    Bisher habe ich das Script benutzt
                    https://github.com/Mic-M/iobroker-createUserStates

                    Ich kenne das Skript kaum, denke aber der Hauptfokus lag seinerzeit auf der Erstellung in 0_userdata.0, was nicht vom JS Adapter unterstützt wurde. Das Skript arbeitet auch noch mit Timeout. Schön zu sehen wie sehr sich iobroker weiterentwickelt hat, wenn man es vergleicht mit den paar Zeilen meines ersten Beispiels. Wäre sehr interessant zu erfahren was der Autor dazu zu sagen hat, evtl. hat es auch heute noch seine Berechtigung, das kann ich nicht beurteilen. Für meine Anwendungen reicht aber das was ich gepostet habe vollkommen aus

                    1 Reply Last reply Reply Quote 0
                    • grrfield
                      grrfield @BananaJoe last edited by

                      @bananajoe Hallo, ich gehe da einen pragmatischen Weg: nach dem Erstellen der States frage ich ab, ob der letzte State bereits existiert und starte das Skript neu, bis er erstellt wurde:

                      createState("javascript.0.Testumgebung.Test1", "Eins", {
                        type: 'string',
                        read: true, 
                        write: true
                      });
                      createState("javascript.0.Testumgebung.Test2", "Zwei", {
                        type: 'string',
                        read: true, 
                        write: true
                      });
                      
                      // Restart, wenn letzter State noch nicht geschrieben
                      if(!existsState("javascript.0.Testumgebung.Test2")) runScript();
                      

                      Da das Neustarten nur beim ersten Anlegen der Datenpunkte passiert, stört es nicht weiter.

                      BananaJoe 1 Reply Last reply Reply Quote 0
                      • BananaJoe
                        BananaJoe Most Active @grrfield last edited by

                        @grrfield sagte in Datenpunkt erstellen und im Anschluss sofort nutzen:

                        if(!existsState("javascript.0.Testumgebung.Test2")) runScript();
                        

                        Da das Neustarten nur beim ersten Anlegen der Datenpunkte passiert, stört es nicht weiter.

                        Cool, Skripte können sich selbst neu starten. Wieder was gelernt.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        743
                        Online

                        31.9k
                        Users

                        80.1k
                        Topics

                        1.3m
                        Posts

                        4
                        12
                        1760
                        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