Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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. [gelöst] JSON-Tabelle in Datenobjekte auflösen (Javascript)

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    7
    1
    276

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    9
    1
    253

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    904

[gelöst] JSON-Tabelle in Datenobjekte auflösen (Javascript)

Geplant Angeheftet Gesperrt Verschoben JavaScript
9 Beiträge 3 Kommentatoren 2.3k Aufrufe 3 Beobachtet
  • Ä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.
  • KalaNagHTDK Offline
    KalaNagHTDK Offline
    KalaNagHTD
    schrieb am zuletzt editiert von KalaNagHTD
    #1

    Hallo Gemeinde,

    ich bekomme vom Adapter (ESP32) an meiner Heizung über MQTT einen JSON-String, aus dem ich einzelne Daten-Objekte erzeugen will.

    Der String mit ID 'mqtt.0.espaltherma.ATTR', den ich adapterseitig mal auf zwei gesendete Werte (Vorlauf- und Rücklauftemperatur) reduziert habe, sieht so aus:
    [{"Leaving":"27.700000","Returning":"24.900000"}]

    Nach Studium mehrerer Threads hier, habe ich nach "paul53" folgendes Javascript gebastelt:

    const idJson = 'mqtt.0.espaltherma.ATTR';
    const path = '0_userdata.0.espaltherma';
    
    on(idJson, function(dp){
    let obj = JSON.parse(dp.state.val);
    let id = path + 'Vorlauf';
    if(existsState(id)) setState(id, obj['Leaving'], true);
    else createState(id, obj['Leaving'], {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
    id = path + 'Rücklauf';
    if(existsState(id)) setState(id, obj['Returning'], true);
    else createState(id, obj['Returning'], {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
    })
    

    Wenn ich das Script laufen lasse kommt folgende Fehlermeldung:

    "script.js.Skript_4: setForeignState: undefined is not a valid state value"

    Leider habe ich aktuell nur einen sehr begrenzten Durchblick und bitte um Hilfe!

    F paul53P 3 Antworten Letzte Antwort
    0
    • KalaNagHTDK KalaNagHTD

      Hallo Gemeinde,

      ich bekomme vom Adapter (ESP32) an meiner Heizung über MQTT einen JSON-String, aus dem ich einzelne Daten-Objekte erzeugen will.

      Der String mit ID 'mqtt.0.espaltherma.ATTR', den ich adapterseitig mal auf zwei gesendete Werte (Vorlauf- und Rücklauftemperatur) reduziert habe, sieht so aus:
      [{"Leaving":"27.700000","Returning":"24.900000"}]

      Nach Studium mehrerer Threads hier, habe ich nach "paul53" folgendes Javascript gebastelt:

      const idJson = 'mqtt.0.espaltherma.ATTR';
      const path = '0_userdata.0.espaltherma';
      
      on(idJson, function(dp){
      let obj = JSON.parse(dp.state.val);
      let id = path + 'Vorlauf';
      if(existsState(id)) setState(id, obj['Leaving'], true);
      else createState(id, obj['Leaving'], {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
      id = path + 'Rücklauf';
      if(existsState(id)) setState(id, obj['Returning'], true);
      else createState(id, obj['Returning'], {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
      })
      

      Wenn ich das Script laufen lasse kommt folgende Fehlermeldung:

      "script.js.Skript_4: setForeignState: undefined is not a valid state value"

      Leider habe ich aktuell nur einen sehr begrenzten Durchblick und bitte um Hilfe!

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

      @kalanaghtd Du hast da ein Array, nimm obj[0]['Leaving']

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

      1 Antwort Letzte Antwort
      1
      • KalaNagHTDK KalaNagHTD

        Hallo Gemeinde,

        ich bekomme vom Adapter (ESP32) an meiner Heizung über MQTT einen JSON-String, aus dem ich einzelne Daten-Objekte erzeugen will.

        Der String mit ID 'mqtt.0.espaltherma.ATTR', den ich adapterseitig mal auf zwei gesendete Werte (Vorlauf- und Rücklauftemperatur) reduziert habe, sieht so aus:
        [{"Leaving":"27.700000","Returning":"24.900000"}]

        Nach Studium mehrerer Threads hier, habe ich nach "paul53" folgendes Javascript gebastelt:

        const idJson = 'mqtt.0.espaltherma.ATTR';
        const path = '0_userdata.0.espaltherma';
        
        on(idJson, function(dp){
        let obj = JSON.parse(dp.state.val);
        let id = path + 'Vorlauf';
        if(existsState(id)) setState(id, obj['Leaving'], true);
        else createState(id, obj['Leaving'], {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
        id = path + 'Rücklauf';
        if(existsState(id)) setState(id, obj['Returning'], true);
        else createState(id, obj['Returning'], {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
        })
        

        Wenn ich das Script laufen lasse kommt folgende Fehlermeldung:

        "script.js.Skript_4: setForeignState: undefined is not a valid state value"

        Leider habe ich aktuell nur einen sehr begrenzten Durchblick und bitte um Hilfe!

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

        @kalanaghtd

           let obj = JSON.parse(dp.state.val)[0];
        

        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

        KalaNagHTDK 1 Antwort Letzte Antwort
        1
        • paul53P paul53

          @kalanaghtd

             let obj = JSON.parse(dp.state.val)[0];
          
          KalaNagHTDK Offline
          KalaNagHTDK Offline
          KalaNagHTD
          schrieb am zuletzt editiert von KalaNagHTD
          #4

          @fastfoot
          @paul53

          So?

          const idJson = 'mqtt.0.espaltherma.ATTR';
          const path = '0_userdata.0.espaltherma';
          
          on(idJson, function(dp){
          let obj = JSON.parse(dp.state.val)[0];
          let id = path + 'Vorlauf';
          if(existsState(id)) setState(id, obj[0]['Leaving'], true);
          else createState(id, obj[0]['Leaving'], {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
          id = path + 'Rücklauf';
          if(existsState(id)) setState(id, obj[0]['Returning'], true);
          else createState(id, obj[0]['Returning'], {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
          })
          

          Fehler jetzt:
          21:24:52.798 error javascript.0 (6500) at Object.<anonymous> (script.js.Skript_4:7:44)

          F 1 Antwort Letzte Antwort
          0
          • KalaNagHTDK KalaNagHTD

            @fastfoot
            @paul53

            So?

            const idJson = 'mqtt.0.espaltherma.ATTR';
            const path = '0_userdata.0.espaltherma';
            
            on(idJson, function(dp){
            let obj = JSON.parse(dp.state.val)[0];
            let id = path + 'Vorlauf';
            if(existsState(id)) setState(id, obj[0]['Leaving'], true);
            else createState(id, obj[0]['Leaving'], {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
            id = path + 'Rücklauf';
            if(existsState(id)) setState(id, obj[0]['Returning'], true);
            else createState(id, obj[0]['Returning'], {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
            })
            

            Fehler jetzt:
            21:24:52.798 error javascript.0 (6500) at Object.<anonymous> (script.js.Skript_4:7:44)

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

            @kalanaghtd sagte in JSON-Tabelle in Datenobjekte auflösen (Javascript):

            So?

            belasse Zeile 5 und in den anderen nimmst du [0] wieder weg.

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

            1 Antwort Letzte Antwort
            1
            • KalaNagHTDK KalaNagHTD

              Hallo Gemeinde,

              ich bekomme vom Adapter (ESP32) an meiner Heizung über MQTT einen JSON-String, aus dem ich einzelne Daten-Objekte erzeugen will.

              Der String mit ID 'mqtt.0.espaltherma.ATTR', den ich adapterseitig mal auf zwei gesendete Werte (Vorlauf- und Rücklauftemperatur) reduziert habe, sieht so aus:
              [{"Leaving":"27.700000","Returning":"24.900000"}]

              Nach Studium mehrerer Threads hier, habe ich nach "paul53" folgendes Javascript gebastelt:

              const idJson = 'mqtt.0.espaltherma.ATTR';
              const path = '0_userdata.0.espaltherma';
              
              on(idJson, function(dp){
              let obj = JSON.parse(dp.state.val);
              let id = path + 'Vorlauf';
              if(existsState(id)) setState(id, obj['Leaving'], true);
              else createState(id, obj['Leaving'], {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
              id = path + 'Rücklauf';
              if(existsState(id)) setState(id, obj['Returning'], true);
              else createState(id, obj['Returning'], {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
              })
              

              Wenn ich das Script laufen lasse kommt folgende Fehlermeldung:

              "script.js.Skript_4: setForeignState: undefined is not a valid state value"

              Leider habe ich aktuell nur einen sehr begrenzten Durchblick und bitte um Hilfe!

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

              @kalanaghtd sagte: [{"Leaving":"27.700000","Returning":"24.900000"}]

              Das Objekt liefert leider keine Zahlen, sondern Strings. Deshalb:

              if(existsState(id)) setState(id, parseFloat(obj['Leaving']), true);
              else createState(id, parseFloat(obj['Leaving']), {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
              id = path + 'Rücklauf';
              if(existsState(id)) setState(id, parseFloat(obj['Returning']), true);
              else createState(id, parseFloat(obj['Returning']), {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
              

              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

              KalaNagHTDK 2 Antworten Letzte Antwort
              1
              • paul53P paul53

                @kalanaghtd sagte: [{"Leaving":"27.700000","Returning":"24.900000"}]

                Das Objekt liefert leider keine Zahlen, sondern Strings. Deshalb:

                if(existsState(id)) setState(id, parseFloat(obj['Leaving']), true);
                else createState(id, parseFloat(obj['Leaving']), {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
                id = path + 'Rücklauf';
                if(existsState(id)) setState(id, parseFloat(obj['Returning']), true);
                else createState(id, parseFloat(obj['Returning']), {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
                
                KalaNagHTDK Offline
                KalaNagHTDK Offline
                KalaNagHTD
                schrieb am zuletzt editiert von KalaNagHTD
                #7

                @fastfoot
                @paul53

                Danke für eure schnelle Rückmeldung!
                Ich werde berichten, sobald ich die Vorschlage ausprobiert habe!

                1 Antwort Letzte Antwort
                0
                • paul53P paul53

                  @kalanaghtd sagte: [{"Leaving":"27.700000","Returning":"24.900000"}]

                  Das Objekt liefert leider keine Zahlen, sondern Strings. Deshalb:

                  if(existsState(id)) setState(id, parseFloat(obj['Leaving']), true);
                  else createState(id, parseFloat(obj['Leaving']), {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
                  id = path + 'Rücklauf';
                  if(existsState(id)) setState(id, parseFloat(obj['Returning']), true);
                  else createState(id, parseFloat(obj['Returning']), {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
                  
                  KalaNagHTDK Offline
                  KalaNagHTDK Offline
                  KalaNagHTD
                  schrieb am zuletzt editiert von
                  #8

                  @paul53
                  @fastfoot

                  Es funktioniert!!!
                  Ganz herzlichen Dank an euch für die kompetente Hilfe!

                  KalaNagHTDK 1 Antwort Letzte Antwort
                  0
                  • KalaNagHTDK KalaNagHTD

                    @paul53
                    @fastfoot

                    Es funktioniert!!!
                    Ganz herzlichen Dank an euch für die kompetente Hilfe!

                    KalaNagHTDK Offline
                    KalaNagHTDK Offline
                    KalaNagHTD
                    schrieb am zuletzt editiert von KalaNagHTD
                    #9

                    Hier nochmal das gesamte Thema auf einen Blick:

                    Mein Adapter liefert im Objekt 'mqtt.0.espaltherma.ATTR' folgenden JSON-String:

                    [{"Outdoor air temp.(R1T)":"11.500000","Discharge pipe temp.":"35.000000","Heat exchanger mid-temp.":"8.500000","INV primary current (A)":"1.300000","Voltage (N-phase) (V)":"238.000000","INV frequency (rps)":"12.000000","Fan 2 (step)":"68.000000","Expansion valve (pls)":"207.000000","BUH Step1":"OFF","BUH Step2":"OFF","Leaving water temp. before BUH (R1T)":"25.700000","Leaving water temp. after BUH (R2T)":"26.000000","Refrig. Temp. liquid side (R3T)":"25.700000","Inlet water temp.(R4T)":"23.800000","DHW tank temp. (R5T)":"45.800000","Ext. indoor ambient sensor (R6T)":"10.700000","Flow sensor (l/min)":"14.300000","Water pressure":"0.000000","Water pump signal (0:max-100:stop)":"49.000000","Pressure Sensor":"16.100000"}]

                    Ich will daraus einzelne Objekte machen, die ich weiter verwenden kann.
                    Die Experten @paul53 und @fasfoot haben die entscheidenden Hinweise gegeben.
                    Sehr wichtig war die Erkenntnis, dass das oben gezeigte JSON-Objekt keine Zahlen sondern Strings liefert.

                    Hier als Beispiel das funktionierende Script mit zwei Daten aus dem JSON-String. Es werden die Objekte "Vorlauf" und "Rücklauf" mit ihren jeweiligen Temperaturwerten erzeugt und im Verzeichnis "0_userdata.0" abgelegt:

                    const idJson = 'mqtt.0.espaltherma.ATTR';
                    const path = '0_userdata.0.';
                    
                    on(idJson, function(dp){
                        let obj = JSON.parse(dp.state.val)[0];
                        let id = path + 'Vorlauf';
                        if(existsState(id)) setState(id, parseFloat(obj['Leaving water temp. before BUH (R1T)']), true);
                        else createState(id, parseFloat(obj['Leaving water temp. before BUH (R1T)']), {type: 'number', name: 'Vorlauf', role: 'value', unit: '°C'});
                        id = path + 'Rücklauf';
                        if(existsState(id)) setState(id, parseFloat(obj['Inlet water temp.(R4T)']), true);
                        else createState(id, parseFloat(obj['Inlet water temp.(R4T)']), {type: 'number', name: 'Rücklauf', role: 'value', unit: '°C'});
                    })
                    1 Antwort Letzte Antwort
                    0

                    Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                    Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                    Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                    Registrieren Anmelden
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    354

                    Online

                    32.8k

                    Benutzer

                    82.8k

                    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