Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Wert wird in State geschrieben

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Wert wird in State geschrieben

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ben1983
      Ben1983 @Codierknecht last edited by

      @codierknecht Nein, dass hatte ich schon drin stehen.. ich kann nochmal was machen. moment.

      1 Reply Last reply Reply Quote 0
      • Ben1983
        Ben1983 @Codierknecht last edited by

        @codierknecht Ausgangspunkt ist:
        State bist komplett leer.

        const idJsonLog = "0_userdata.0.TestJSON.MeinJSON";
        setState(idJsonLog,[],true);
        
        function addElement(what){
            let jsonLog = getState(idJsonLog).val;
            let mydate = new Date(Date.now());
            let element = {Zeitstempel:mydate.toLocaleString(), Was:what};
            jsonLog.unshift(element);
        }
        
        addElement("erstes");
        addElement("zweites");
        addElement("drittes");
        
        
        log(JSON.stringify(getState(idJsonLog).val));
        

        ergibt log:

        	javascript.0 (15798) script.js.x_testskripte.arraypushen: [{"Zeitstempel":"19.9.2023, 09:10:33","Was":"drittes"},{"Zeitstempel":"19.9.2023, 09:10:33","Was":"zweites"},{"Zeitstempel":"19.9.2023, 09:10:33","Was":"erstes"}]
        

        im state steht genau das Array mit den JSON elementen drin.
        Warum? Ich schreibe die doch nirgends.

        Wenn ich die Zeile:

        setState(idJsonLog,[],true);
        

        vorher ausführe, dann aus dem Script heraus nehme, dann geht es auch, allerdings steht im state dann nur [] der log allerdigns bleibt gleich.
        Ich frage mich halt, warum überhaupt was im state steht. ich schreibe ja nichts rein, außer am anfang [].

        Ohne dass ich [] rein schreibe geht gar nichts

        Codierknecht 1 Reply Last reply Reply Quote 0
        • Codierknecht
          Codierknecht Developer Most Active @Ben1983 last edited by

          @ben1983
          Hast Du die Javascript-Instanz mal neu gestartet?
          Möglich, dass da noch alter Code im Speicher hängengeblieben ist.

          Oder eben ein anderes Script, dass da im Hintergrund Dinge in den State schreibt.

          Ben1983 1 Reply Last reply Reply Quote 0
          • Ben1983
            Ben1983 @Codierknecht last edited by

            @codierknecht

            es muss irgendwas mit der Zeile hier zu tun haben:

            let jsonLog = getState(idJsonLog).val;
            

            ist die nicht so drin, dann schreibt er nichts.
            Ist das irgendwie ne referenz, die er da zuweist?

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

              @codierknecht Ja habe neu gestartet.
              Ein Anderes Script kann nicht sein, da ich den Datenpunkt nur für den Zweck zum Testen angelegt habe

              Codierknecht 1 Reply Last reply Reply Quote 0
              • Codierknecht
                Codierknecht Developer Most Active @Ben1983 last edited by

                @ben1983
                Welchen Typ hat der DP?
                Ich versuche das mal nachzustellen.

                Codierknecht 1 Reply Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @Codierknecht last edited by

                  @Ben1983
                  Da wird offensichtlich tatsächlich eine Referenz übergeben.
                  Ich habe den DP mal als Typ "JSON" angelegt.

                  Das unshift verändert direkt den DP - auch ohne dass man explizit mit setState reinschreibt.
                  Lässt man das weg, wird auch nix geschrieben.

                  Ich muss aber gestehen: JS ist nicht meine Kernkompetenz 😉

                  Ben1983 1 Reply Last reply Reply Quote 0
                  • Ben1983
                    Ben1983 @Codierknecht last edited by

                    @codierknecht

                    Ich habe es so gemacht.
                    Also nicht direkt das getstate einer Variablen übergeben,
                    sondern mit JSON.parse zugewiesen.
                    Dann schreibt er nichts, außer man macht wirklich das setstate.
                    Allerdings hat es anders auch seinen charme. man muss es nur wissen.

                    const idJsonLog = "0_userdata.0.TestJSON.MeinJSON";
                    function addElement(what){
                        let jsonLog = [];
                        try{
                            jsonLog = JSON.parse(getState(idJsonLog).val);
                        }
                        catch(error){
                            log(error);
                        }
                        if(typeof(jsonLog) !== "object"){
                            jsonLog = [];
                        }
                        let mydate = new Date(Date.now());
                        let element = {Zeitstempel:mydate.toLocaleString(), Was:what};
                        jsonLog.unshift(element);
                        setState(idJsonLog,JSON.stringify(jsonLog),true);
                    }
                    
                    addElement("erstes");
                    addElement("zweites");
                    addElement("drittes");
                    
                    
                    log(JSON.stringify(getState(idJsonLog).val));
                    
                    paul53 1 Reply Last reply Reply Quote 1
                    • paul53
                      paul53 @Ben1983 last edited by

                      @ben1983 sagte: mit JSON.parse zugewiesen.

                      Der Datenpunkt hatte wohl den falschen Typ? Wäre der Datenpunkt vom Typ "array" gewesen, hätte es der Javascript-Adapter von sich aus gemacht.

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

                        @paul53 der Datenpunkt ist json

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

                          @ben1983 sagte: der Datenpunkt ist json

                          Dann muss man die Wandlung in ein Array und zurück im Skript machen.

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

                            @paul53 ja habe ich ja, alles gut. danke.
                            Es ging nicht darum, sondern darum, dass er den Datenpunkt sonst beschrieben hatte ohne setState

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

                              @ben1983 sagte: Ist das irgendwie ne referenz, die er da zuweist?

                              Ja, Objekte / Arrays werden als Referenz übergeben. Die Variable jsonLog zeigt in den Zustands-Puffer der Javascript-Instanz.

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

                                @paul53 Ah ok.
                                Das Bedeutet, wenn ich also einen State vom Typ Array / JSON habe, dann kann ich diesen auslesen, zuweisen und kann direkt im JS damit arbeiten, ohne auf ihn schreiben zu müssen?

                                Klingt interessant. Ich habe nun zwar die Variante gewählt, in der ich es mir den Wert parse, damit das nicht der Fall ist
                                (war irgendwie besser zu behandeln, wenn nichts, oder sagen wir "Quatsch" im State stand.

                                Aber gibts da ne Empfehlung wie man es machen sollte?

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

                                  @ben1983 sagte: ohne auf ihn schreiben zu müssen?

                                  Nein. Die Änderungen finden so nur im Puffer der Javascript-Instanz statt und werden nicht an den js-controller weiter gegeben. Dafür benötigt man setState().
                                  Schreibt man mit setState() ein Array in einen Datenpunkt vom Typ "json", erhält man eine Typ-Warnung. Datenpunkte dürfen keine "echten" Objekte / Arrays enthalten (was früher mal anders war).

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

                                    @paul53 OK, ich habe es ja jetzt auch so gemacht, allerdings schreibt er beim ersten durchlauf des scripts, wenn ich vorher den state [] zuweise auch alle Veränderungen des Arrays in den state. nach einem 2.aufuf de sscripts (wenn kein [] mehr zugewiesen wird, dann nicht. (Obwohl die daten drin stehen, wenn man mit getState den datenpunkt ausliest.

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

                                      @ben1983 sagte: wenn ich vorher den state [] zuweise

                                      Dann wird ein "echtes" Array in den DP vom Typ "json" geschrieben und später ausgelesen. Es sollte eine Typ-Warnung geben.
                                      Richtig wäre, den String '[]' (leeres Array als JSON) zuzuweisen.

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

                                        @paul53 OK,

                                        jetzt mache ich es wie gesetzt so:

                                        jsonLog = JSON.parse(getState(idJsonLog).val);
                                        

                                        und weise es später so zu:

                                        setState(idJsonLog,JSON.stringify(jsonLog),true);
                                        

                                        Funktioniert einwandfrei.

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

                                          @ben1983 sagte: Funktioniert einwandfrei.

                                          So ist der richtige Umgang mit einem DP vom Typ "json". Bei einem DP vom Typ "array" übernimmt der Javascript-Adapter die Wandlung von und nach JSON.

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

                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          525
                                          Online

                                          31.7k
                                          Users

                                          79.8k
                                          Topics

                                          1.3m
                                          Posts

                                          3
                                          21
                                          641
                                          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