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.
    • BananaJoe
      BananaJoe Most Active last edited by

      In praktisch jedem meiner Skripte erstelle ich am Anfang ggf. benötigte Datenpunkte.
      Danach kommt in der Regel eine "Erst-Befüllung" der Datenpunkte und dann ggf. Subscriptions.

      Wenn der Datenpunkt gerade erstellt wurde kann ich diesen aber 2 Zeilen später noch nicht nutzen:

      // Datenpunkt erstellen
      createState("javascript.0.Testumgebung.Test1", "Eins", {
        type: 'string',
        read: true, 
        write: true
      });
      
      // Datenpunkt ändern
      setState("javascript.0.Testumgebung.Test1", "Zwei");
      

      7a8a787e-2382-4754-812b-3eb176814092-image.png

      Ich drücke dann immer einmal auf Neustart und dann geht es.
      Wie bekomme ich es hin das erst weitermacht wenn der Datenpunkt erstellt ist?

      Das ich natürlich die Erstbefüllung mit dem Erstellen der Datenpunkte verbinden könnte ist mir klar, aber ich hatte das Problem auch schon in anderen Konstellationen, z.B. wenn sich 2 getrennte Skripte über einen Datenpunkt abstimmen sollten (Ich laufe gerade, mach du nichts), das hat auch nicht geklappt weil für das andere Skript der Wert noch gar nicht geschrieben war.

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

        @bananajoe
        mit einem timeout probiert ?

        Bildschirmfoto 2021-04-14 um 20.57.18.png

        Aus der JS Ansicht

        var timeout;
        
        
        createState("jsState", 'eins', JSON.parse('{ "role" : "string" , "type" : "string" , "name" : "A" }'), async function () {
        });
        (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
        timeout = setTimeout(async function () {
          setStateDelayed('javascript.0.jsState', 'zwei', true, parseInt(0, 10), false);
        }, 1000);
        
        BananaJoe 1 Reply Last reply Reply Quote 0
        • 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

                            777
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

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