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. [gelöst] Wert wird in State geschrieben

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    951

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] Wert wird in State geschrieben

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
21 Beiträge 3 Kommentatoren 1.5k Aufrufe 2 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.
  • CodierknechtC Codierknecht

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

    CodierknechtC Offline
    CodierknechtC Offline
    Codierknecht
    Developer Most Active
    schrieb am zuletzt editiert von
    #9

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

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

    Proxmox 9.1.1 LXC|8 GB|Core i7-6700
    HmIP|ZigBee|Tasmota|Unifi
    Zabbix Certified Specialist
    Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

    Ben1983B 1 Antwort Letzte Antwort
    0
    • CodierknechtC Codierknecht

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

      Ben1983B Offline
      Ben1983B Offline
      Ben1983
      schrieb am zuletzt editiert von
      #10

      @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));
      
      paul53P 1 Antwort Letzte Antwort
      1
      • Ben1983B Ben1983

        @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));
        
        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #11

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

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        Ben1983B 1 Antwort Letzte Antwort
        0
        • paul53P paul53

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

          Ben1983B Offline
          Ben1983B Offline
          Ben1983
          schrieb am zuletzt editiert von
          #12

          @paul53 der Datenpunkt ist json

          paul53P 1 Antwort Letzte Antwort
          0
          • Ben1983B Ben1983

            @paul53 der Datenpunkt ist json

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #13

            @ben1983 sagte: der Datenpunkt ist json

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

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            Ben1983B 1 Antwort Letzte Antwort
            0
            • paul53P paul53

              @ben1983 sagte: der Datenpunkt ist json

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

              Ben1983B Offline
              Ben1983B Offline
              Ben1983
              schrieb am zuletzt editiert von
              #14

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

              1 Antwort Letzte Antwort
              0
              • Ben1983B Ben1983

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

                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von paul53
                #15

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

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                Ben1983B 1 Antwort Letzte Antwort
                0
                • paul53P 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.

                  Ben1983B Offline
                  Ben1983B Offline
                  Ben1983
                  schrieb am zuletzt editiert von
                  #16

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

                  paul53P 1 Antwort Letzte Antwort
                  0
                  • Ben1983B Ben1983

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

                    paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von paul53
                    #17

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

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                    Ben1983B 1 Antwort Letzte Antwort
                    0
                    • paul53P 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).

                      Ben1983B Offline
                      Ben1983B Offline
                      Ben1983
                      schrieb am zuletzt editiert von
                      #18

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

                      paul53P 1 Antwort Letzte Antwort
                      0
                      • Ben1983B Ben1983

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

                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #19

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

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        Ben1983B 1 Antwort Letzte Antwort
                        0
                        • paul53P paul53

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

                          Ben1983B Offline
                          Ben1983B Offline
                          Ben1983
                          schrieb am zuletzt editiert von
                          #20

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

                          paul53P 1 Antwort Letzte Antwort
                          0
                          • Ben1983B Ben1983

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

                            paul53P Offline
                            paul53P Offline
                            paul53
                            schrieb am zuletzt editiert von
                            #21

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

                            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                            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

                            680

                            Online

                            32.6k

                            Benutzer

                            82.2k

                            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