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. Schleife über Datenpunkte (JSON) inkl. DP ERstellung

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Schleife über Datenpunkte (JSON) inkl. DP ERstellung

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
10 Beiträge 2 Kommentatoren 562 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.
  • nukleuzN Offline
    nukleuzN Offline
    nukleuz
    schrieb am zuletzt editiert von
    #1

    Hallo zusammen,

    ich brauche Hilfe bei der Umsetzung einer Programmieraufgabe.

    Ich möchte gerne in Blockly eine Schleife über mehrere Datenpunkte laufen lassen und aus den darin enthaltenen Daten (eindimensionale JSON Strings) dynamisch die für mich wichtigen Daten in einzelne Datenpunkte schreiben. Temperatur, Luftfeuchtigkeit und Name des Geräts.
    Der Inhalt des JSON ist immer gleich - es sind 8 Thermometer die per BLE und OpenMQTTGateway in den MQTT-Adapter gesendet werden.

    Speicherort der neuen DP: 0_Userdata.0.Klima...
    Pfad des Datenpunkts: mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.0423832779CB
    JSON eines Datenpunkts:

    {
      "id": "04:23:83:27:79:CB",
      "mac_type": 1,
      "rssi": -50,
      "brand": "ThermoPro",
      "tempc": "21",
      "hum": "47",
      "name": "TP(348)",
      "aem": "215037e3"
    etc..........
    }
    

    Hat das schon mal jemand gemacht?

    Danke für Input vorab.

    Intel NUC -> ProxMox -> Debian -> ioBroker (Master)| RPI3B+ -> rtl_433 (Slave) | CCU2

    CodierknechtC 1 Antwort Letzte Antwort
    0
    • nukleuzN nukleuz

      Hallo zusammen,

      ich brauche Hilfe bei der Umsetzung einer Programmieraufgabe.

      Ich möchte gerne in Blockly eine Schleife über mehrere Datenpunkte laufen lassen und aus den darin enthaltenen Daten (eindimensionale JSON Strings) dynamisch die für mich wichtigen Daten in einzelne Datenpunkte schreiben. Temperatur, Luftfeuchtigkeit und Name des Geräts.
      Der Inhalt des JSON ist immer gleich - es sind 8 Thermometer die per BLE und OpenMQTTGateway in den MQTT-Adapter gesendet werden.

      Speicherort der neuen DP: 0_Userdata.0.Klima...
      Pfad des Datenpunkts: mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.0423832779CB
      JSON eines Datenpunkts:

      {
        "id": "04:23:83:27:79:CB",
        "mac_type": 1,
        "rssi": -50,
        "brand": "ThermoPro",
        "tempc": "21",
        "hum": "47",
        "name": "TP(348)",
        "aem": "215037e3"
      etc..........
      }
      

      Hat das schon mal jemand gemacht?

      Danke für Input vorab.

      CodierknechtC Online
      CodierknechtC Online
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @nukleuz sagte in Schleife über Datenpunkte (JSON) inkl. DP ERstellung:

      mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.

      Gemacht nicht, aber das sollte ja keine Raketenwissenschaft sein.

      Sind die 8 Thermometer über eine einheitliche Struktur ansprechbar?
      Also sowas wie mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.*.
      Wenn nicht, könnte man die in eine Aufzählung packen und über diese "enumeration" eine Schleife laufen lassen.

      "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

      nukleuzN 1 Antwort Letzte Antwort
      0
      • CodierknechtC Codierknecht

        @nukleuz sagte in Schleife über Datenpunkte (JSON) inkl. DP ERstellung:

        mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.

        Gemacht nicht, aber das sollte ja keine Raketenwissenschaft sein.

        Sind die 8 Thermometer über eine einheitliche Struktur ansprechbar?
        Also sowas wie mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.*.
        Wenn nicht, könnte man die in eine Aufzählung packen und über diese "enumeration" eine Schleife laufen lassen.

        nukleuzN Offline
        nukleuzN Offline
        nukleuz
        schrieb am zuletzt editiert von nukleuz
        #3

        Sind die 8 Thermometer über eine einheitliche Struktur ansprechbar?
        Also sowas wie mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.*.
        Wenn nicht, könnte man die in eine Aufzählung packen und über diese "enumeration" eine Schleife laufen lassen.

        Ja, korrekt - genau da sind alle DP drin...

        EDIT: Die Aufzählung ist tatsächlich die bessere Variante, da ich nicht weiss, wie gut die White-/Blacklists funktionieren.

        Intel NUC -> ProxMox -> Debian -> ioBroker (Master)| RPI3B+ -> rtl_433 (Slave) | CCU2

        CodierknechtC 1 Antwort Letzte Antwort
        0
        • nukleuzN nukleuz

          Sind die 8 Thermometer über eine einheitliche Struktur ansprechbar?
          Also sowas wie mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.*.
          Wenn nicht, könnte man die in eine Aufzählung packen und über diese "enumeration" eine Schleife laufen lassen.

          Ja, korrekt - genau da sind alle DP drin...

          EDIT: Die Aufzählung ist tatsächlich die bessere Variante, da ich nicht weiss, wie gut die White-/Blacklists funktionieren.

          CodierknechtC Online
          CodierknechtC Online
          Codierknecht
          Developer Most Active
          schrieb am zuletzt editiert von
          #4

          @nukleuz
          Und der Trigger wäre was?
          Von den 8 Thermometern kommen ja jeweils mehrere Werte an.
          Wann sollen die neuen DP geschrieben werden? Bei Änderung von Temperatur oder Luftfeuchte? Das wären dann schon mal 16 Elemente in der Aufzählung.

          "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

          nukleuzN 1 Antwort Letzte Antwort
          0
          • CodierknechtC Codierknecht

            @nukleuz
            Und der Trigger wäre was?
            Von den 8 Thermometern kommen ja jeweils mehrere Werte an.
            Wann sollen die neuen DP geschrieben werden? Bei Änderung von Temperatur oder Luftfeuchte? Das wären dann schon mal 16 Elemente in der Aufzählung.

            nukleuzN Offline
            nukleuzN Offline
            nukleuz
            schrieb am zuletzt editiert von
            #5

            @codierknecht

            Ich würde erst mal alle 1-5min die Werte holen, um ein Gefühl dafür zu bekommen, ob die im Intervall senden oder nur bei Änderung.

            Da bin ich noch nicht richtig schlüssig, aber für jede Anregung dankbar.
            Erst dachte ich daran die 8 DP mit JSON zu nehmen, doch dann würden mit ODER verknüpft immer alle DP aktualisiert werden, auch wenn es keine Änderung gab...

            Mhhh... :)

            Intel NUC -> ProxMox -> Debian -> ioBroker (Master)| RPI3B+ -> rtl_433 (Slave) | CCU2

            CodierknechtC 1 Antwort Letzte Antwort
            0
            • nukleuzN nukleuz

              @codierknecht

              Ich würde erst mal alle 1-5min die Werte holen, um ein Gefühl dafür zu bekommen, ob die im Intervall senden oder nur bei Änderung.

              Da bin ich noch nicht richtig schlüssig, aber für jede Anregung dankbar.
              Erst dachte ich daran die 8 DP mit JSON zu nehmen, doch dann würden mit ODER verknüpft immer alle DP aktualisiert werden, auch wenn es keine Änderung gab...

              Mhhh... :)

              CodierknechtC Online
              CodierknechtC Online
              Codierknecht
              Developer Most Active
              schrieb am zuletzt editiert von
              #6

              @nukleuz
              Ich würde die 16 8 relevanten DP (sind ja nur 8 weil Temperatur und Luftfeuchte in einem JSON stecken) in eine Aufzählung packen und auf Änderung triggern. Wenn's zu viel wird, kann man auf zyklisch umstellen.

              Im Prinzip sähe das so aus:
              748ccc01-8d2a-4379-9be1-abf58d4c877d-image.png

              "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

              nukleuzN 1 Antwort Letzte Antwort
              1
              • CodierknechtC Codierknecht

                @nukleuz
                Ich würde die 16 8 relevanten DP (sind ja nur 8 weil Temperatur und Luftfeuchte in einem JSON stecken) in eine Aufzählung packen und auf Änderung triggern. Wenn's zu viel wird, kann man auf zyklisch umstellen.

                Im Prinzip sähe das so aus:
                748ccc01-8d2a-4379-9be1-abf58d4c877d-image.png

                nukleuzN Offline
                nukleuzN Offline
                nukleuz
                schrieb am zuletzt editiert von
                #7

                @codierknecht

                Das werde ich in der Mittagspause gleich testen - gebe Feedback :)

                Intel NUC -> ProxMox -> Debian -> ioBroker (Master)| RPI3B+ -> rtl_433 (Slave) | CCU2

                1 Antwort Letzte Antwort
                0
                • nukleuzN Offline
                  nukleuzN Offline
                  nukleuz
                  schrieb am zuletzt editiert von
                  #8

                  @codierknecht

                  Prinzipiell funktioniert das, nur wie lege ich die Datenpunkte an, ohne Sie vorab manuell anlegen zu müssen?
                  Es gibt zwar den Baustein: "Datenpunkt erzeugen", doch wie kann ich dort den Pfad variabel gestalten?

                  Danke...

                  Intel NUC -> ProxMox -> Debian -> ioBroker (Master)| RPI3B+ -> rtl_433 (Slave) | CCU2

                  CodierknechtC 1 Antwort Letzte Antwort
                  0
                  • nukleuzN nukleuz

                    @codierknecht

                    Prinzipiell funktioniert das, nur wie lege ich die Datenpunkte an, ohne Sie vorab manuell anlegen zu müssen?
                    Es gibt zwar den Baustein: "Datenpunkt erzeugen", doch wie kann ich dort den Pfad variabel gestalten?

                    Danke...

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

                    @nukleuz
                    Am besten mit JS. Blockly ist da leider nicht wirklich geeignet.

                    40670ea2-86e2-4191-9680-9d29f08c60c0-image.png

                    const id = '0_userdata.0.klima.';
                    const aName = getObject(dpName).common.name;
                    if (!existsObject(id + aName)) {
                        setObject(id + aName, {type: 'device', common: {name: 'Temperatursensor'}, native: {}});
                        createState(id + aName + '.temp', 0, {name: 'Temperatur', type: 'number', unit: '°C'});
                        createState(id + aName + '.hum', 0, {name: 'Luftfeuchtigkeit', type: 'number', unit: '%'});
                    }
                    

                    "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

                    nukleuzN 1 Antwort Letzte Antwort
                    1
                    • CodierknechtC Codierknecht

                      @nukleuz
                      Am besten mit JS. Blockly ist da leider nicht wirklich geeignet.

                      40670ea2-86e2-4191-9680-9d29f08c60c0-image.png

                      const id = '0_userdata.0.klima.';
                      const aName = getObject(dpName).common.name;
                      if (!existsObject(id + aName)) {
                          setObject(id + aName, {type: 'device', common: {name: 'Temperatursensor'}, native: {}});
                          createState(id + aName + '.temp', 0, {name: 'Temperatur', type: 'number', unit: '°C'});
                          createState(id + aName + '.hum', 0, {name: 'Luftfeuchtigkeit', type: 'number', unit: '%'});
                      }
                      
                      nukleuzN Offline
                      nukleuzN Offline
                      nukleuz
                      schrieb am zuletzt editiert von
                      #10

                      @codierknecht

                      Ich habe es für meine Zwecke hinbekommen.
                      Danke für die Hilfestellung...

                      Hier das Skript, falls jemand vor dem gleichen oder ähnlichem Problem steht:

                      var json, name2; 
                      const idDP = '0_userdata.0.Klima.Test.';
                      
                      on({id: [].concat(Array.prototype.slice.apply($("state[id=*](functions=thermo)"))), change: "ne"}, async function (obj) {
                        var value = obj.state.val;
                        var oldValue = obj.oldState.val;
                        json = (obj.state ? obj.state.val : "");
                        
                        name2 = [idDP,getAttr(json, 'name'),'.temperatur'].join('');
                        name2 = name2.replace("(", "");
                        name2 = name2.replace(")", "");
                        name2 = name2.replace(/\s/g, '-');
                        console.log(name2);
                      
                        createState(name2, 0, {name: 'Temperatur', type: 'number',  role: 'sensor.humidity', unit: '°C'});
                        setStateDelayed(name2, getAttr(json, 'tempc'), true, parseInt(((3000) || "").toString(), 10), false);
                      
                        name2 = [idDP,getAttr(json, 'name'),'.humidity'].join('');
                        name2 = name2.replace("(", "");
                        name2 = name2.replace(")", "");
                        name2 = name2.replace(/\s/g, '-');
                        console.log(name2);
                        
                        createState(name2, 0, {name: 'Luftfeuchtigkeit', type: 'number', role: 'sensor.temperature', unit: '%'});
                        setStateDelayed(name2, getAttr(json, 'hum'), true, parseInt(((3000) || "").toString(), 10), false);
                      
                        name2 = [idDP,getAttr(json, 'name'),'.rssi'].join('');
                        name2 = name2.replace("(", "");
                        name2 = name2.replace(")", "");
                        name2 = name2.replace(/\s/g, '-');
                        console.log(name2);
                        
                        createState(name2, 0, {name: 'Empfangsstärke', type: 'number', role: 'value.rssi', unit: 'dBm'});
                        setStateDelayed(name2, getAttr(json, 'hum'), true, parseInt(((3000) || "").toString(), 10), false);
                      
                      });
                      

                      Intel NUC -> ProxMox -> Debian -> ioBroker (Master)| RPI3B+ -> rtl_433 (Slave) | CCU2

                      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

                      818

                      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