Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Objekte unterhalb eines Odners lesen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Objekte unterhalb eines Odners lesen

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

      Hallo,

      bezüglich einer MQQT Schnittstelle zu einem Hersteller liefert dieser "NUR" in den Topics einen Wert in Form eine JSONs aus.
      Im MQTT State steht dann bspw.

      {value: 2.5}
      

      Ich würde gerne ein Skript erstellen, das mir mit Eingabe des Startverzeichnisses alle unterlagerten Objekte in einem angegeben Zielverzeichnis erstellt und deren Wert anlegt.

      Gibt es eine Möglichkeit im Javascript Adapter Die Verzeichnisse zu durchlaufen, sodass ich auch wirklich abfragen kann ist es ein folder, oder channel, state etc.?
      Oder wäre ein gängiger Weg mit einer Regex einfach den Hauptpfad zu subscriben und dann auf Änderungen zu reagieren?
      Dann hätte man allerdings die States erst nach einer änderung. und die channels wären grundsätzlich alle folders... ps. sind sie aber glaube im falle vom mqtt adapter sowieso alle, da dies ja einfach die topic darstellt glaube ich.

      Thomas Braun 1 Reply Last reply Reply Quote 0
      • Thomas Braun
        Thomas Braun Most Active @Ben1983 last edited by

        @ben1983

        So ganz verstehe ich dein Anliegen zwar nicht, aber wenn es um das Zerlegen einer mqtt-Nachricht in Datenpunkte gehen sollte:

        // where the mqtt messages arrive
        
        const mqttDatenpunktObjectId = 'mqtt.0.solix.site.device.scenInfo';
        
        // where the states should appear
        
        const userDataFolder = '0_userdata.0.device';
        
         
        
        // ############## end user config
        
         
        
        // receive
        
        on(mqttDatenpunktObjectId, (obj) => {
          // log(JSON.stringify(obj.state.val))
          const jsonString = obj.state.val;
        
          const jsonData = JSON.parse(jsonString);
        
         
        
          function createObjectsRecursively(parent, data) {
        
            for (const key in data) {
        
              const obj = data[key];
        
              const stateName = `${parent}.${key}`;
        
             
        
              if (typeof obj === 'object') {
        
                createObjectsRecursively(stateName, obj);
        
              } else {
        
               let value = obj;  
        
         
        
                // Check if the state already exists. If it does, just update the value.
        
                // If it does not exist create the states.
        
                if (!existsState(stateName)) {
        
                  // If the state does not exist, create it and set the value
        
                  createState(stateName, value, {
        
                    name: key,
        
                    type: typeof value,
        
                    role: "value",
        
                    read: true,
        
                    write: true
        
                  });
        
                  log(`Created state ${stateName}`);
        
                  
        
                } else {
                  // log(stateName + ': ' + value)
                  setState(stateName, value, true);
        
                }
        
              }
        
            }
        
          }
        
           createObjectsRecursively(userDataFolder, jsonData);
        
        });
        
        Ben1983 1 Reply Last reply Reply Quote 0
        • Ben1983
          Ben1983 @Thomas Braun last edited by

          @thomas-braun Danke, hatte so gelöst:

          
          const quelle = "mqtt.0.N.c0619ab24727";
          const ziel = "0_userdata.0.Tests.Victron";
          
          const quelleRegEx = new RegExp(quelle);
          on({id:quelleRegEx,change:"any"},async (dp)=>{
              const zielId = ziel + dp.id.substring(quelle.length,dp.id.length);
              const stateJson = JSON.parse(dp.state.val);
              if(typeof stateJson === "object"){
                  for(const att in stateJson){
                      const attId = `${zielId}.${att}`;
                      await createStateAsync(attId);
                      await setStateAsync(attId,stateJson[att],true);
                  }
              }
              else{
                  await createStateAsync(zielId);
                  await setStateAsync(zielId,dp.state.val,true);
              }
          });
          

          Allerdings kommt wohl sehr viel über den MQTT Adapter rein.... Ich bekam eine Meldung, dass setState mehr als 1000 mal ausgeführt wurde pro Minute 😄

          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          902
          Online

          31.8k
          Users

          80.0k
          Topics

          1.3m
          Posts

          2
          3
          121
          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