Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Schleife über Datenpunkte (JSON) inkl. DP ERstellung

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Schleife über Datenpunkte (JSON) inkl. DP ERstellung

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

      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.

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

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

        nukleuz 1 Reply Last reply Reply Quote 0
        • nukleuz
          nukleuz @Codierknecht last edited by 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.

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

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

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

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

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

                @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

                nukleuz 1 Reply Last reply Reply Quote 1
                • nukleuz
                  nukleuz @Codierknecht last edited by

                  @codierknecht

                  Das werde ich in der Mittagspause gleich testen - gebe Feedback 🙂

                  1 Reply Last reply Reply Quote 0
                  • nukleuz
                    nukleuz last edited by

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

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @nukleuz last edited by 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: '%'});
                      }
                      
                      nukleuz 1 Reply Last reply Reply Quote 1
                      • nukleuz
                        nukleuz @Codierknecht last edited by

                        @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);
                        
                        });
                        
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        824
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        2
                        10
                        340
                        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