Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    1.6k

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    671

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    1.2k

( gelöst ) Ordnernamen auslesen und in Datenpunkt schreiben

Geplant Angeheftet Gesperrt Verschoben JavaScript
3 Beiträge 2 Kommentatoren 208 Aufrufe 2 Beobachtet
  • Ä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

        Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

        Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

        Mit deinem Input könnte dieser Beitrag noch besser werden 💗

        Registrieren Anmelden
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        Support us

        ioBroker
        Community Adapters
        Donate

        584

        Online

        32.9k

        Benutzer

        83.0k

        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