Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. ( gelöst ) Ordnernamen auslesen und in Datenpunkt schreiben

    NEWS

    • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    ( gelöst ) Ordnernamen auslesen und in Datenpunkt schreiben

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

      Ich möchte gerne meine Ordnerstruktur auslesen
      0_userdata.0.Gasanbieter
      dort befinden sich mehrere Ordner von Gasanbietern
      Diese Ordnernamen möchte ich gerne in den Datenpunkt
      0_userdata.0.Gasanbieter.Gasanbieter_Liste
      schreiben

      ich habe folgendes Skript soweit zusammen gebastelt. Leider bleibt der Datenpunkt leer und das Skript schreibt folgenden Fehler

      javascript.0 01:49:14.704 info
      Stopping script
      javascript.0 01:49:14.920 info
      start JavaScript (Javascript/js)
      javascript.0 01:49:14.948 info
      --- START ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---
      javascript.0 01:49:14.954 info
      registered 0 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
      javascript.0 01:49:34.949 error
      SCHWERER FEHLER: Das getObjects-Result ist leer oder fehlerhaft (Timeout?). Bitte JS-Adapter neustarten.
      javascript.0 01:49:34.950 info
      --- ENDE ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---

      Das Skript sieht so aus

      /**
       * FINALE VERSION: Sucht Ordner, liest den Wert des Datenpunkts ORDNERNAME.ORDNERNAME aus
       * und schreibt diesen Wert in die Zielliste.
       */
      
      const parentId = '0_userdata.0.Gasanbieter.'; 
      const targetId = '0_userdata.0.Gasanbieter'; 
      const excludePrefix = 'gasanbieter_'; 
      
      // Führt die Liste einmalig beim Skriptstart aus
      updateGasanbieterList(); 
      
      // Führt die Liste jeden Tag um Mitternacht aus (Cron-Job)
      schedule('0 0 * * *', updateGasanbieterList); 
      
      async function updateGasanbieterList() {
          log('--- START ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---', 'info');
          
          // 1. ASYNCHRONE FUNKTION ZUM ABFRUFEN DER OBJEKTE
          sendTo('javascript.0', 'getObjects', {
              id: parentId + '*',
              limit: 1000
          }, async (result) => { // Beachten Sie das 'async' hier, um await nutzen zu können
              
              if (result && result.result) {
                  const objectIds = Object.keys(result.result);
                  log(`Gefundene Objekte insgesamt: ${objectIds.length}`, 'info');
      
                  const folderNamesToRead = new Set();
      
                  // Zuerst alle relevanten Ordnernamen sammeln
                  objectIds.forEach(id => {
                      const obj = result.result[id];
                      
                      // Nur Objekte vom Typ 'channel' oder 'device' (Ordner) berücksichtigen.
                      if (obj && (obj.type === 'channel' || obj.type === 'device')) {
                          
                          if (id.startsWith(parentId) && id !== parentId) {
                              const relativeId = id.substring(parentId.length);
                              const folderName = relativeId.split('.')[0]; 
                              
                              if (folderName && folderName.length > 0) {
                                  if (!folderName.startsWith(excludePrefix)) {
                                      folderNamesToRead.add(folderName); 
                                  }
                              }
                          }
                      }
                  });
      
                  const uniqueValues = [];
                  const folderNamesArray = Array.from(folderNamesToRead);
                  log(`Gefundene relevante Ordnernamen: ${JSON.stringify(folderNamesArray)}`, 'info');
      
                  // 2. ALLE WERTE ASYNCHRON AUSLESEN
                  for (const name of folderNamesArray) {
                      // Die ID des Zieldatenpunktes zusammensetzen: 0_userdata.0.Gasanbieter.ORDNERNAME.ORDNERNAME
                      const stateIdToRead = parentId + name + '.' + name;
                      
                      try {
                          // getForeignStateAsync muss im Skript aktiviert sein (Standard)
                          const state = await getForeignStateAsync(stateIdToRead);
                          
                          if (state && state.val !== null && state.val !== undefined) {
                              // Den Wert (val) zur finalen Liste hinzufügen
                              uniqueValues.push(String(state.val));
                              log(`Wert von ${stateIdToRead} erfolgreich gelesen: ${state.val}`, 'debug');
                          } else {
                              log(`WARNUNG: Datenpunkt ${stateIdToRead} existiert nicht oder hat keinen Wert.`, 'warn');
                          }
                      } catch (e) {
                          log(`FEHLER beim Lesen von ${stateIdToRead}: ${e.message}`, 'error');
                      }
                  }
      
                  // 3. ERGEBNIS SPEICHERN
                  const resultString = JSON.stringify(uniqueValues);
                  log(`Final gefilterte Liste der Werte: ${resultString}`, 'info');
                  
                  setForeignState(targetId, resultString, true);
                  log(`Liste in ${targetId} gespeichert.`, 'info');
                  
              } else {
                  log('SCHWERER FEHLER: Das getObjects-Result ist leer oder fehlerhaft (Timeout?). Bitte JS-Adapter neustarten.', 'error');
              }
              log('--- ENDE ABGLEICH: WERTE AUS DATENPUNKTEN LESEN ---', 'info');
          });
      }
      

      Hat das schonmal jemand hinbekommen?

      VG
      Thomas

      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @perladd last edited by

        @perladd

        du kannst mal das probieren. den rest müsstest du selbst hinbekommen

        let prefix = '0_userdata.0.Gasanbieter.';
        let dp=$(prefix+"*");
        console.log(dp);
        

        https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#---selector

        1 Reply Last reply Reply Quote 1
        • P
          perladd last edited by

          @oliverio sagte in Ordnernamen auslesen und in Datenpunkt schreiben:

          let prefix = '0_userdata.0.Gasanbieter.'; let dp=$(prefix+"*"); console.log(dp);

          Hallo

          so der Hinweis hat mich zumindest auf einige Fehler noch in meinen Datenpunktnamen gebracht. Damit konnte ich dann den Fehler immer weiter eingrenzen, so das es jetzt klappt

          Danke

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

          Support us

          ioBroker
          Community Adapters
          Donate

          492
          Online

          32.4k
          Users

          81.3k
          Topics

          1.3m
          Posts

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