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 ) Ordnernamen auslesen und in Datenpunkt schreiben

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

( gelöst ) Ordnernamen auslesen und in Datenpunkt schreiben

Geplant Angeheftet Gesperrt Verschoben JavaScript
3 Beiträge 2 Kommentatoren 180 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.
  • P Offline
    P Offline
    perladd
    schrieb am zuletzt editiert von perladd
    #1

    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

    OliverIOO 1 Antwort Letzte Antwort
    0
    • P 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

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von
      #2

      @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

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      1 Antwort Letzte Antwort
      1
      • P Offline
        P Offline
        perladd
        schrieb am zuletzt editiert von
        #3

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

        583

        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