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 neu erstellen und gleich beschrieben

    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 neu erstellen und gleich beschrieben

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

      Wie erzeuge ich einen neuen Datenpunkt und schreibe dann ein paar Zeilen später (also nicht im createstate) einen Wert hinein?

      var StatusDP = "javascript.0.ESP." + EspDevice + ".table"; 
      if (!existsState(StatusDP)){createState(StatusDP, "",{type: "string",name: 'HTML Tabelle des ESP', read: true,write: true,role: "value", unit: ""});};
      setState(StatusDP, Table);   
      
      

      liefert, sowohl mit createState als auch mit createStateAsync beim ersten Durchgang des Skriptes

      State "javascript.0.ESP.483FDA36363A.table" not found
      

      beim zweiten Durchgang klappt dann alles (weil der DP ja dann da ist))

      BananaJoe paul53 2 Replies Last reply Reply Quote 0
      • BananaJoe
        BananaJoe Most Active @WolfgangFB last edited by

        @wolfgangfb Hier ein Beispiel aus einem meiner Skripts:

        // Funktionen
        async function CreateMyStatesAndStartup(){
            try {
                DebugWarning("Startup: Erstelle ggf. Datenpunkte ...");
                // POWER
                await createStateAsync(s_state_FullPath + ".POWER", false, {
                    type: 'boolean',
                    read: true, 
                    write: true, 
                    role: "switch",
                    name: s_DeviceName + s_Suffix + '.POWER'
                });
                // RSSI
                await createStateAsync(s_state_FullPath + ".RSII", 0, {
                    type: 'number',
                    read: true, 
                    write: false, 
                    name: 'WLAN Stärke in %'
                });
        }
            catch(error) {
                DebugWarning(error);
                log(error);
            }
        }
        // Hauptprogram
        CreateMyStatesAndStartup();
        

        Ich hab mir das in eine Funktion gepackt, nachdem diese ausgeführt ist sind die Datenpunkte vorhanden und nutzbar.
        Du kannst die Datenpunkte sogar innerhalb der Funktion schon nutzen, direkt nach dem Anlegen.

        Ich hatte die gleiche Frage damals auch gestellt: https://forum.iobroker.net/topic/44190/datenpunkt-erstellen-und-im-anschluss-sofort-nutzen

        Es war wichtig das das ganze in einer Funktion stattfindet, sonst funktioniert die await Geschichte nicht

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

          @bananajoe

          Danke, werde ich ausprobieren. Aber richtig cool finde ich die Sache mit dem sich selbst neustartenden Script aus Deinem Thread. Das kann ich für viele andere Dinge brauchen.

          1 Reply Last reply Reply Quote 1
          • W
            WolfgangFB last edited by

            @bananajoe
            Hi

            Irgendwas mache ich noch falsch:

            async function CreateIfNotExist(Name="", InitValue, common){
                console.log("Name: " + Name);
                if (!existsState(Name)){
                    await createStateAsync(Name, InitValue, common);
                }
            }
            CreateIfNotExist(StatusDP, "Hallo", {type: "string",name: 'S0 counter des ESP', read: true,write: true,role: "value", unit: "Flaschbier"});
            console.log("Datenpunkt existiert: " + existsState(StatusDP));
            
            

            liefert:

            Datenpunkt existiert: false
            

            Beim zweiten Aufruf ist der Datenpunkt beschreibbar (genau wie bei createState oder createStateAsync).

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

              @wolfgangfb sagte: Wie erzeuge ich einen neuen Datenpunkt und schreibe dann ein paar Zeilen später (also nicht im createstate) einen Wert hinein?

              Mit common.def:

              const StatusDP = "javascript.0.ESP." + EspDevice + ".table"; 
              var Table = ...;
              
              if (existsState(StatusDP)) setState(StatusDP, Table, true);  
              else createState(StatusDP, Table,{type: "string", name: 'HTML Tabelle des ESP', read: true,write: true,role: "value", def: Table});
              
              W 1 Reply Last reply Reply Quote 0
              • W
                WolfgangFB @paul53 last edited by

                @paul53 sagte in Datenpunkt neu erstellen und gleich beschrieben:

                @wolfgangfb sagte: Wie erzeuge ich einen neuen Datenpunkt und schreibe dann ein paar Zeilen später (also nicht im createstate) einen Wert hinein?

                Mit common.def:

                const StatusDP = "javascript.0.ESP." + EspDevice + ".table"; 
                var Table = ...;
                
                if (existsState(StatusDP)) setState(StatusDP, Table, true);  
                else createState(StatusDP, Table,{type: "string", name: 'HTML Tabelle des ESP', read: true,write: true,role: "value", def: Table});
                

                Hallo Paul

                Das funktioniert aber auch nur, wenn einmalig etwas in den Datenpunkt geschrieben wird.
                Mir (und ich glaube auch BananaJoe) geht es darum, in einem Skript, dass z.B. einen Wert überwacht und dann immer wieder einen passenden Datenpunkt beschreibt, dafür zu sorgen, dass der Datenpunkt auch vorhanden ist. Bei Deiner Lösung wäre bei der nächsten Änderung auch der Punkt nicht vorhanden.
                Beispiel: Ein Skript summiert über die aufgenommene Leistung einer Steckdose mit Leistungsmessung die Gesamtenergie und schreibt die für jeden Tag getrennt in einen Datenpunkt.
                Wenn jetzt ein neuer Tag beginnt muss zuerst der Datenpunkt neu angelegt werden und dann abhängig von der Leistung die Tagesenergie in den Datenpunkt geschrieben werden. Und das vielleicht schon nach wenigen Millisekunden mit einem neuen Wert, und dann ist der Datenpunkt eben noch nicht da.

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

                  @wolfgangfb sagte: dann ist der Datenpunkt eben noch nicht da.

                  Bei einem noch nicht vorhanden Datenpunkt wird der Wert mit createState() geschrieben, in allen anderen Fällen mit setState().

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

                    @paul53
                    Dann muss ich aber an jeder Stelle im Skript "setState" durch "if (existState()... else createstate(...)" ersetzen.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    627
                    Online

                    31.7k
                    Users

                    79.9k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    524
                    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