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.
    • 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

                          436
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

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