NEWS
( gelöst ) Ordnernamen auslesen und in Datenpunkt schreiben
-
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
schreibenich 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 -
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
schreibenich 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
Thomasdu 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
-
@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
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