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. [gelöst] JSON-Tabelle in Datenobjekte auflösen (Javascript)

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
9 Beiträge 3 Kommentatoren 2.1k Aufrufe 3 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.
  • K Offline
    K 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
    • K 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
      • K 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

        K 1 Antwort Letzte Antwort
        1
        • paul53P paul53

          @kalanaghtd

             let obj = JSON.parse(dp.state.val)[0];
          
          K Offline
          K 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
          • K 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
            • K 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

              K 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'});
                
                K Offline
                K 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'});
                  
                  K Offline
                  K Offline
                  KalaNagHTD
                  schrieb am zuletzt editiert von
                  #8

                  @paul53
                  @fastfoot

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

                  K 1 Antwort Letzte Antwort
                  0
                  • K KalaNagHTD

                    @paul53
                    @fastfoot

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

                    K Offline
                    K 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
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    586

                    Online

                    32.4k

                    Benutzer

                    81.5k

                    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