Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Datenpunkt erstellen und im Anschluss sofort nutzen

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    998

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

Datenpunkt erstellen und im Anschluss sofort nutzen

Geplant Angeheftet Gesperrt Verschoben JavaScript
12 Beiträge 4 Kommentatoren 2.0k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • BananaJoeB Online
    BananaJoeB Online
    BananaJoe
    Most Active
    schrieb am zuletzt editiert von
    #1

    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.

    ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

    dslraserD F grrfieldG 3 Antworten Letzte Antwort
    0
    • BananaJoeB BananaJoe

      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.

      dslraserD Offline
      dslraserD Offline
      dslraser
      Forum Testing Most Active
      schrieb am zuletzt editiert von
      #2

      @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);
      
      BananaJoeB 1 Antwort Letzte Antwort
      0
      • BananaJoeB BananaJoe

        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.

        F Offline
        F Offline
        fastfoot
        schrieb am zuletzt editiert von fastfoot
        #3

        @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();
        

        iobroker läuft unter Docker auf QNAP TS-451+
        SkriptRecovery: https://forum.iobroker.net/post/930558

        BananaJoeB 1 Antwort Letzte Antwort
        2
        • dslraserD dslraser

          @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);
          
          BananaJoeB Online
          BananaJoeB Online
          BananaJoe
          Most Active
          schrieb am zuletzt editiert von
          #4

          @dslraser hatte ich schon probiert, funktioniert nicht

          ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

          dslraserD 2 Antworten Letzte Antwort
          0
          • F 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();
            

            BananaJoeB Online
            BananaJoeB Online
            BananaJoe
            Most Active
            schrieb am zuletzt editiert von
            #5

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

            ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

            1 Antwort Letzte Antwort
            0
            • BananaJoeB BananaJoe

              @dslraser hatte ich schon probiert, funktioniert nicht

              dslraserD Offline
              dslraserD Offline
              dslraser
              Forum Testing Most Active
              schrieb am zuletzt editiert von
              #6

              @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 Antwort Letzte Antwort
              0
              • BananaJoeB BananaJoe

                @dslraser hatte ich schon probiert, funktioniert nicht

                dslraserD Offline
                dslraserD Offline
                dslraser
                Forum Testing Most Active
                schrieb am zuletzt editiert von dslraser
                #7

                @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 Antwort Letzte Antwort
                0
                • dslraserD dslraser

                  @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 Offline
                  F Offline
                  fastfoot
                  schrieb am zuletzt editiert von
                  #8

                  @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');
                  }
                  

                  iobroker läuft unter Docker auf QNAP TS-451+
                  SkriptRecovery: https://forum.iobroker.net/post/930558

                  dslraserD 1 Antwort Letzte Antwort
                  2
                  • F fastfoot

                    @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');
                    }
                    
                    dslraserD Offline
                    dslraserD Offline
                    dslraser
                    Forum Testing Most Active
                    schrieb am zuletzt editiert von dslraser
                    #9

                    @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 Antwort Letzte Antwort
                    0
                    • dslraserD 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 Offline
                      F Offline
                      fastfoot
                      schrieb am zuletzt editiert von
                      #10

                      @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

                      iobroker läuft unter Docker auf QNAP TS-451+
                      SkriptRecovery: https://forum.iobroker.net/post/930558

                      1 Antwort Letzte Antwort
                      0
                      • BananaJoeB BananaJoe

                        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.

                        grrfieldG Offline
                        grrfieldG Offline
                        grrfield
                        schrieb am zuletzt editiert von
                        #11

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

                        BananaJoeB 1 Antwort Letzte Antwort
                        0
                        • grrfieldG grrfield

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

                          BananaJoeB Online
                          BananaJoeB Online
                          BananaJoe
                          Most Active
                          schrieb am zuletzt editiert von
                          #12

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

                          ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

                          1 Antwort Letzte Antwort
                          0
                          Antworten
                          • In einem neuen Thema antworten
                          Anmelden zum Antworten
                          • Älteste zuerst
                          • Neuste zuerst
                          • Meiste Stimmen


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          610

                          Online

                          32.5k

                          Benutzer

                          81.6k

                          Themen

                          1.3m

                          Beiträge
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                          ioBroker Community 2014-2025
                          logo
                          • Anmelden

                          • Du hast noch kein Konto? Registrieren

                          • Anmelden oder registrieren, um zu suchen
                          • Erster Beitrag
                            Letzter Beitrag
                          0
                          • Home
                          • Aktuell
                          • Tags
                          • Ungelesen 0
                          • Kategorien
                          • Unreplied
                          • Beliebt
                          • GitHub
                          • Docu
                          • Hilfe